我有一个脚本,用于在调用 csh shell 中设置一些环境变量。其中一些变量取决于脚本的位置。
如果文件是正确的 csh 脚本,我可以使用 $0 来访问__FILE__
,但如果我使用源代码运行脚本,它只会告诉我 csh 或 tcsh。
由于我使用它在父 shell 中设置变量,所以我必须使用 source.
该怎么办?
如果您$_
在文件的第一行访问,它将包含文件的名称(如果它是来源的)。如果它直接运行,那么$0
将包含名称。
#!/bin/tcsh
set called=($_)
if ($called[2] != "") echo "Sourced: $called[2]"
if ($0 != "tcsh") echo "Called: $0"
这很难阅读,但实际上是有效的:
如果您的脚本名为 test.csh
/usr/sbin/lsof +p $$ | \grep -oE /.\*test.csh
这个答案描述了如何lsof
以及一点 grep 魔法似乎是唯一有机会为 csh/tcsh 下的嵌套源文件工作的东西。
如果您的脚本名为source_me.tcsh
:
/usr/sbin/lsof -p $$ | grep -oE '/.*source_me\.tcsh'
当$$
在子外壳中调用源时,它不起作用。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。这来自为什么 $$ 返回与父进程相同的 id?. 第二行查找为读取常规文件而打开的第一个(希望是唯一的)FD。这来自上面的engtech。