我有一个脚本,用于在调用csh shell中设置一些env变量。其中一些变量取决于脚本的位置。
如果文件是正确的csh脚本,我可以使用$ 0来访问__FILE__
但如果我使用source运行脚本,它只会告诉我csh或tcsh。
由于我使用它在父shell中设置vars,我必须使用source。
怎么办?
答案 0 :(得分:2)
如果您访问文件第一行的$_
,它将包含文件的名称(如果已获取)。如果它直接运行,那么$0
将包含名称。
#!/bin/tcsh
set called=($_)
if ($called[2] != "") echo "Sourced: $called[2]"
if ($0 != "tcsh") echo "Called: $0"
答案 1 :(得分:1)
这很难读,但确实有效:
如果您的脚本名为test.csh
/usr/sbin/lsof +p $$ | \grep -oE /.\*test.csh
答案 2 :(得分:0)
this answer描述了lsof
和一点grep魔术是唯一看起来有可能在tcsh下处理嵌套源文件的事情:
/usr/sbin/lsof +p $$ | grep -oE /.\*source_me.tcsh
答案 3 :(得分:0)
在子外壳程序中调用源时,$$
不起作用。 BASH_PID
仅适用于bash。
% (sleep 1; source source_me.csh)
我发现以下作品更好一些:
% set pid=`cut -d' ' -f4 < /proc/self/stat`
% set file=`/usr/sbin/lsof +p $pid|grep -m1 -P '\s\d+r\s+REG\s' | xargs | cut -d' ' -f9`
第一行找到正在获取文件的当前进程的pid。这来自Why is $$ returning the same id as the parent process?。第二行找到为读取常规文件而打开的第一个(也是希望的)FD。这来自上面的engtech。