【问题标题】:csh script as executable does not setenvcsh 脚本作为可执行文件不 setenv
【发布时间】:2015-02-26 08:59:45
【问题描述】:

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

csh/tcsh 可执行脚本“myscript”中设置的env 变量

脚本的内容...

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

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

myscript
echo $MYVAR
MYVAR "Undefined variable"

但是如果我在命令行中获取源代码

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

【问题讨论】:

    标签: environment-variables csh tcsh


    【解决方案1】:

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

    你当然可以嵌入

     source /home/xx/bin/myscript
    

    在您的.cshrc

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

    【讨论】:

    • 谢谢你们@Carpetsmoker,感谢你们的cmets,会做源代码,但是我对它之前是如何工作的困惑仍然不清楚,我在RHEL 5.5上
    【解决方案2】:

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

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

    $ setenv LS_COLORS=foo
    $ ls
    

    您首先为tcsh进程设置LS_COLORStcsh然后启动子进程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"
    

    【讨论】:

    • 谢谢,我的设置是遗留的,它应该通过 ~/.cshrc 运行,其中 ~/.cshrc 始终来自命令行,并且在其中一行中包含“myscript”.. 我做不知道为什么它在一些 linux 机器上运行,为什么它显示你刚才解释的行为......我很困惑
    猜你喜欢
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    相关资源
    最近更新 更多