Я использую tcsh и пытаюсь получить переменную окружения, которая динамически ссылается на другую ...

Я хочу быть в состоянии сделать следующее, и я уверен, что я видел это раньше, в другом месте:

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

> a_is_abc

$ setenv A def
$ echo $B

> a_is_def

Однако, когда $ B изначально установлен, он оценивает $ A в то время, а не сохраняет его для оценки, когда это действительно необходимо. Это означает, что я получаю один и тот же результат для 'echo $ B' оба раза.

есть идеи как это сделать?

Спасибо

2 ответа2

1

Я не думаю, что вы можете сделать это в оболочке. B всегда будет принимать значение A, когда B установлено, а не когда B читается.

Единственное место, где я видел то, что вы описали, находится в Makefiles, где оно будет хранить выражение и оценивать его во время чтения.

0

Я думаю, что я понял это ...

$ 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

Это все об использовании комбинации 'eval' с кавычками вокруг переменной в первую очередь ...

В моем случае я использую это так:

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

И затем, в сценарии оболочки для программного обеспечения, я просто имею:

eval setenv SW_PATH $SW_PATH

Это означает, что я могу изменить SW_VERSION_MAJOR или SW_VERSION_MINOR в любое время, и SW_PATH изменится соответственно без необходимости сброса с нуля.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .