在bash2中,如何找到所源脚本的名称?

时间:2011-04-25 16:02:05

标签: bash

这是我的情况:

我在源代码控制中有多个版本的脚本,其名称因路径名组件而异(例如: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。)

5 个答案:

答案 0 :(得分:0)

尝试使用$0代替${BASH_SOURCE[0]}。 (没有承诺;我没有bash 2。)

答案 1 :(得分:0)

$0具有您正在执行的程序/脚本的名称。

答案 2 :(得分:0)

状态还好吗?

之类的东西
stat -c %N $file

答案 3 :(得分:0)

bash的cdpwd内置版有一个-P选项来解析符号链接,所以:

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

适用于bash 2.03

答案 4 :(得分:0)

我设法使用此命令获取有关获取我的脚本的信息:

ps -ef | grep $$

这并不完美,但会告诉您要调用脚本的过程。它可以通过一些格式化来确定确切的来源。