在bash2中,我如何找到正在被引用的脚本的名称?

4

这是我的情况:

我有多个版本的脚本在源代码控制中,名称不同于路径名组件(例如:scc/project/1.0/script和scc/project/1.1/script)。在另一个目录中,有一个符号链接指向其中一个脚本。符号链接名称与脚本名称无关,并且在某些情况下可能会定期更改。该符号链接又通过bash使用“.”命令进行来源。

我需要知道的是:如何确定引用脚本的目录,在一个10年前安装了Bash 2和Perl 5.5的系统上?由于各种原因,必须使用该系统,而且不能升级。

在Bash 3或更高版本中,我使用以下命令:

dir=`perl -MCwd=realpath -MFile::Basename 'print dirname(realpath($ARGV[0]))' ${BASH_SOURCE[0]} $0`

很抱歉这里使用了Perl的一行脚本 - 这原本是一个纯Perl项目,只有少量的shell脚本代码。

我已经解决了我所使用的古老Perl没有从Cwd中导出“realpath”的问题,但不幸的是,Bash 2.03.01没有提供BASH_SOURCE或类似的变量。作为一个解决方案,我将路径信息提供在一个文本文件中,当我切换分支时手动更改该文件,但我真的希望能让这个程序自己找到它正在使用哪个分支。

更新: 非常抱歉 - 显然,问题描述得不够清楚。我不知道每个符号链接的名称是什么 - 这就是我想在运行时找出的。该脚本偶尔直接通过符号链接执行,但大多数情况下,该链接是在另一个脚本中运行的"."命令的参数。

此外,在脚本通过"."被源化运行时,$0没有适当地设置,这也是我要解决的整个问题。很抱歉直言不讳,但任何完全依赖于正确设置$0的解决方案都是错误的。在Perl的一个命令行中,我同时使用了BASH_SOURCE和$0(只有当脚本未通过"."被源化运行时,BASH_SOURCE才会被设置,因此该命令行只在不是源化运行时使用$0)。


strace能帮助你获取有关调用的信息吗? - Lynch
5个回答

0
尝试使用$0而不是${BASH_SOURCE[0]}。(不保证,我没有bash 2。)

如果我执行的是“sh linkname”,那么$0将起作用。不幸的是,对于“. linkname”,$0会被设置为源它的shell认为的$0(对于登录shell来说是“-bash”,对于从另一个脚本中执行时是源脚本)。 - Jim Schneider
我曾经担心过这个问题。后来的版本和一些其他的shell将$0设置为被“source”的脚本,但是在如何管理$0方面并没有太多的一致性(这就是为什么bash添加了$BASH_SOURCE的原因)。 - geekosaur

0

$0 包含了你正在执行的程序/脚本的名称。


0

这个stat没问题吧?就像这样

stat -c %N $file

0

bash的cdpwd内置命令有一个-P选项来解析符号链接,因此:

dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)

适用于Bash 2.03


0

我使用以下命令成功获取了关于运行我的脚本的进程信息:

ps -ef | grep $$

这并不完美,但可以告诉你哪个进程调用了你的脚本。通过一些格式化可能可以确定确切的来源。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接