如何在 tcsh 中设置动态引用其他环境变量的环境变量?

如何在 tcsh 中设置动态引用其他环境变量的环境变量?

我在这里使用 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”都会得到相同的结果。

知道如何做到这一点吗?

谢谢

答案1

我认为您不能在 shell 中执行此操作。当设置 B 时,B 将始终采用 A 的值,而不是在读取 B 时。

我所见过的唯一地方是你所描述的是在 Makefiles 中,它会在那里保留表达式并在读取时对其进行评估。

答案2

我想我已经弄清楚了……

$ 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 也会相应更改,而无需从头开始重置。

相关内容