采购 csh 脚本不会设置路径变量而没有错误的替换

采购 csh 脚本不会设置路径变量而没有错误的替换

我正在为源路径变量编写一个简单的脚本,如下所示:

#!/bin/csh
echo "setting path"
set path=($path /sbin:/mscc/apps)

但是,路径变量不会改变并保持不变。 csh shell 没有任何错误/警告。

如果我添加无效行,例如:

setenv PATH $PATH:sbin

它抱怨“糟糕的替代品”。但上面的两条路径被添加了。为什么会发生这种情况?

答案1

我只能复制这个,如果我执行这样的脚本:

$ echo $path
/usr/local/bin /usr/bin /usr/local/sbin /usr/sbin

$ ./script.csh
setting path
$ echo $path
/usr/local/bin /usr/bin /usr/local/sbin /usr/sbin

如果你改为来源脚本,你会看到不同的行为:

$ source script.csh
setting path
$ echo $path
/usr/local/bin /usr/bin /usr/local/sbin /usr/sbin /sbin:/mscc/apps

(也许您想要/sbin /mscc/apps用空格而不是冒号来分隔元素?)

答案2

这不一样跑步一个脚本并source一个脚本。当你跑步一个脚本(带有./script.sh),您正在生成一个新进程,该进程将执行该脚本。与此同时,shell 进程(您编写的进程./script.sh)将等待其他进程完成,并可能捕获输出。

生成的进程能够修改自己的环境(例如变量path),但不能修改其父进程的环境。当它完成时,该进程将终止,并且父进程将在 中保持相同的值path

您想要的是运行父进程set path=($path /sbin:/mscc/apps)。为此,请编写source ./script.sh而不是./script.sh.在这种情况下#!/bin/csh,不需要该行,因为它只是一条注释。

答案3

这两个在 HPUX 上的 csh 中都对我有用:

版本 1(更新 $path):

#!/bin/csh
echo "setting path"
set path=($path:q /sbin /mscc/apps)
echo '==[ echo $PATH - updated/exported by csh ]=='
echo $PATH
echo '==[ echo $path ]=='
echo $path
echo '==[ foreach pdir ($path:q) ; echo $pdir ; end - $path is a list ]=='
foreach pdir ($path:q)
    echo $pdir
end
echo '==[ sub-process $PATH - updated PATH exported by csh automatically ]=='
perl -e 'print $ENV{PATH}."\n";'

版本 2(更新 $PATH):

#!/bin/csh
echo "setting path"
setenv PATH "${PATH}:/sbin:/mscc/apps"
echo '==[ echo $PATH - exported by csh ]=='
echo $PATH
echo '==[ echo $path - updated from $PATH by csh ]=='
echo $path
echo '==[ foreach pdir ($path:q) ; echo $pdir ; end - $path is a list ]=='
foreach pdir ($path:q)
    echo $pdir
end
echo '==[ sub-process $PATH - updated PATH exported by csh automatically ]=='
perl -e 'print $ENV{PATH}."\n";'

相关内容