这是我的情况:
我有多个版本的脚本在源代码控制中,名称不同于路径名组件(例如: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)。