6

我有一个脚本,用于在调用 csh shell 中设置一些环境变量。其中一些变量取决于脚本的位置。

如果文件是正确的 csh 脚本,我可以使用 $0 来访问__FILE__,但如果我使用源代码运行脚本,它只会告诉我 csh 或 tcsh。

由于我使用它在父 shell 中设置变量,所以我必须使用 source.

该怎么办?

4

4 回答 4

3

如果您$_在文件的第一行访问,它将包含文件的名称(如果它是来源的)。如果它直接运行,那么$0将包含名称。

#!/bin/tcsh
set called=($_)
if ($called[2] != "") echo "Sourced: $called[2]"
if ($0 != "tcsh") echo "Called: $0"
于 2010-12-03T04:08:43.210 回答
2

这很难阅读,但实际上是有效的:

如果您的脚本名为 test.csh

/usr/sbin/lsof +p $$ | \grep -oE /.\*test.csh

于 2013-04-29T16:01:22.113 回答
1

这个答案描述了如何lsof以及一点 grep 魔法似乎是唯一有机会为 csh/tcsh 下的嵌套源文件工作的东西。

如果您的脚本名为source_me.tcsh

/usr/sbin/lsof -p $$ | grep -oE '/.*source_me\.tcsh'
于 2019-06-07T14:21:14.827 回答
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。这来自为什么 $$ 返回与父进程相同的 id?. 第二行查找为读取常规文件而打开的第一个(希望是唯一的)FD。这来自上面的engtech。

于 2020-06-28T05:47:15.413 回答