Como eu defino uma variável de ambiente no tcsh que referencia dinamicamente outras env vars?

0

Estou usando o tcsh aqui e estou tentando obter uma variável de ambiente que faça referência a outra dinamicamente ...

Eu quero ser capaz de fazer o seguinte, e tenho certeza que já o fiz antes em outro lugar:

$ setenv A abc
$ setenv B a_is_${A}
$ echo $B

> a_is_abc

$ setenv A def
$ echo $B

> a_is_def

No entanto, quando $ B é inicialmente definido, ele avalia $ A nesse momento, em vez de mantê-lo para ser avaliado quando realmente necessário. Significa que recebo o mesmo resultado para "echo $ B" nas duas vezes.

Alguma ideia de como fazer isso?

Obrigado

    
por Hugh 17.10.2010 / 19:24

2 respostas

0

Acho que descobri este aqui ...

$ setenv A abc
$ setenv B 'a_is_${A}'
$ echo $B

> a_is_$A

$ eval echo $B

> a_is_abc

$ setenv A def
$ eval echo $B

> a_is_def

É tudo sobre o uso de uma combinação de 'eval' com citações em torno da variável em primeiro lugar ...

No meu caso, estou usando assim:

set sw_version '${SW_VERSION_MAJOR}.${SW_VERSION_MINOR}'
set sw_plugin_path /path/to/plugins/for/sw/${sw_version}/plugins


if ( $?SW_PATH ) then
    setenv SW_PATH ${sw_plugin_path}:$SW_PATH
else
    setenv SW_PATH ${sw_plugin_path}
endif

E, no script de wrapper do software, eu só tenho:

eval setenv SW_PATH $SW_PATH

O que significa que posso alterar SW_VERSION_MAJOR ou SW_VERSION_MINOR a qualquer momento, e SW_PATH será alterado de acordo sem precisar ser redefinido do zero.

    
por 31.10.2010 / 16:47
1

Eu não acho que você pode fazer isso no shell. B sempre terá o valor de A quando B é definido, não quando B é lido.

O único lugar em que vi o que você descreveu está em Makefiles, onde ele manteria a expressão e a avaliaria no momento em que fosse lida.

    
por 18.10.2010 / 16:52