作为可执行文件的csh脚本不会setenv

时间:2015-02-26 08:59:45

标签: environment-variables csh tcsh

我无法通过可执行env脚本设置csh/tcsh变量

env可执行脚本中的csh/tcsh变量" myscript"

脚本的内容......

setenv MYVAR /abc/xyz

无法在shell上设置并报告"未定义变量"

我已通过以下shell命令使csh/tcsh脚本成为可执行文件

chmod +x /home/xx/bin/myscript

路径也更新为

set path = (/home/xx/bin $path)    
which myscript    
/home/xx/bin/myscript

当我在命令行上运行脚本并回显env变量..

myscript
echo $MYVAR
MYVAR "Undefined variable"

但如果我在命令行上来源

source /home/xx/bin/myscript
echo $MYVAR
/abc/xyz

2 个答案:

答案 0 :(得分:3)

您需要source您的代码而不是执行它,以便由您想要修改环境的当前shell进行评估。

你当然可以嵌入

 source /home/xx/bin/myscript

.cshrc

脚本不需要是可执行的,也不需要#! shebang(尽管它们不会受到伤害)

答案 1 :(得分:1)

这不是环境变量的工作方式。

为进程设置环境变量(在本例中为tcsh),该变量将传递给所有子进程。所以当你这样做时:

$ setenv LS_COLORS=foo
$ ls

您首先为LS_COLORS流程tcsh设置tcsh,然后启动ls环境中的子流程tcsh(包括LS_COLORS),然后可以使用它。

但是,您正在做的是将环境设置为子进程,然后将其传播回父进程(以某种方式)。这是不可能的。这与tcsh无关,它对系统上的任何进程都是这样的。

它与source一起使用,因为source读取文件,并在当前进程中逐行执行 。因此,它不会启动新的tcsh流程。

我会把它作为练习留给你,如果它 可能意味着什么意思:-)你真的想处理设置一些随机环境变量的不明智的shell脚本吗?那么php进程设置的环境变量呢,我们是否希望这些变量返回到父httpd进程? : - )


您并没有真正描述您尝试实现的目标,但总的来说,您希望执行以下操作:

#!/bin/csh -f                                                               

# ... Do stuff ...                                                          

echo "Please copy this line to your environment:"
echo "setenv MYVAR $myvar"