这是我的情况:
我在源代码控制中有多个版本的脚本,其名称因路径名组件而异(例如:scc / project / 1.0 / script和scc / project / 1.1 / script)。在另一个目录中,有一个符号链接到其中一个脚本。符号链接名称与脚本名称无关,在某些情况下可能会定期更改。反过来,这个符号链接是由bash使用'。'来源的。命令。
我需要知道的是:在具有Bash 2和Perl 5.5的已有10年历史的系统上,如何确定引用脚本的目录?由于各种原因,必须使用系统,并且无法升级。
在Bash 3或以上版本中,我使用了这个:
dir=`perl -MCwd=realpath -MFile::Basename 'print dirname(realpath($ARGV[0]))' ${BASH_SOURCE[0]} $0`
Perl one-liner的道歉 - 这本来是一个纯粹的Perl项目,只有极少量的shell脚本胶水。
我已经能够解决这样一个事实,即我使用的古老Perl并没有从Cwd导出“realpath”,但不幸的是,Bash 2.03.01没有提供BASH_SOURCE,或类似的东西,我'已经找到了。作为一种解决方法,我在一个文本文件中提供路径信息,当我切换分支时我会手动更改,但我真的想弄清楚我自己使用哪个分支。
更新: 我道歉 - 显然,问的问题不明确。在每种情况下我都不知道符号链接的名称是什么 - 这就是我在运行时想要找到的东西。该脚本偶尔会通过符号链接直接执行,但最常见的是链接是“。”的参数。命令在另一个脚本中运行。
此外,当脚本通过“。”获取时,$ 0未正确设置,这是我正在尝试解决的整个问题。我为直言而道歉,但完全不依赖于$ 0的解决方案是正确的。在Perl单线程中,我使用BASH_SOURCE和$ 0(BASH_SOURCE仅在脚本通过“。”获取时设置,因此单行仅在未获取时使用$ 0。)
答案 0 :(得分:0)
尝试使用$0
代替${BASH_SOURCE[0]}
。 (没有承诺;我没有bash
2。)
答案 1 :(得分:0)
$0
具有您正在执行的程序/脚本的名称。
答案 2 :(得分:0)
状态还好吗?
之类的东西stat -c %N $file
答案 3 :(得分:0)
bash的cd
和pwd
内置版有一个-P选项来解析符号链接,所以:
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
适用于bash 2.03
答案 4 :(得分:0)
我设法使用此命令获取有关获取我的脚本的信息:
ps -ef | grep $$
这并不完美,但会告诉您要调用脚本的过程。它可以通过一些格式化来确定确切的来源。