我正在为源路径变量编写一个简单的脚本,如下所示:
#!/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";'