4

我试图让一个源 shell 脚本确定它自己的位置,我发现这对于 dash 来说是一项艰巨的任务。

在 bash、sh 和 csh 中,我可以使用:$_.

在鱼中,我可以使用(status -f).

在短跑中,我没有运气......

我已尝试使用以下结果获取下面显示的 path.sh 文件:

# path.sh
called=$_
echo called:      $called
echo underscore:  $_
echo zero:        $0
echo dash_source: $DASH_SOURCE
echo bash_source: $BASH_SOURCE

dash -c ". path.sh"

输出:

called:      /usr/local/bin/dash
underscore:  /usr/local/bin/dash
zero:        dash
dash_source:
bash_source:

如何在破折号中获取 path.sh 的路径?

4

4 回答 4

3

似乎没有任何可移植(POSIX 标准)的方式来做到这一点。

POSIX 将采购称为“脚本”。虽然 shell 语言参考的其他几个部分确实讨论了“点脚本”,但这些实例似乎都没有提供任何方法来找出当前执行的点脚本的路径。特别是,$0保留给与“点脚本”不同的“shell 脚本”。“来源”一词不会以任何大写形式出现在页面上,也不会作为任何较大单词的一部分出现(所以没有类似$BASH_SOURCE的东西)。影响 shell 的标准环境变量似乎也不相关。我要说这在 POSIX 规范中是不可能的。由于 Dash 非常紧密地遵循 POSIX,因此对于这种特定情况不太可能有 Dashism(如果要这样做,它会'$BASH_SOURCE或创建一个类似的变量)。

于 2015-10-06T23:42:20.330 回答
2

我同意接受的答案,尽管我能够使用 lsof 使其工作:

x=$(lsof -p $$ -Fn0 | tail -1); script=${x#n}

这是有效的,因为 dash 在执行时保持脚本打开。这需要是脚本的第一行,否则如果 dash 稍后打开其他文件描述符,它可能会失败。

于 2017-03-15T16:05:30.880 回答
1

dash这在 POSIX shell 标准(实现,仅此而已) 下是不可能的。.是内置的,而不是 shell 脚本,因此,$0位置参数指的是 的调用者.$1如果存在,则指的是该调用者的参数。特别是,这些东西都不是指.本身或其参数脚本。

于 2016-08-30T01:21:36.523 回答
0

如果您可以更改源代码,请将此函数放在所有源调用之前。

.() {
   command . "$1"
}
. script.sh
# more dot scripts

什么是挂钩'点脚本'函数,现在在函数内部,位置参数是函数参数。因此,在您的源脚本中,位置参数是:

.         # $0
script.sh # $1

在正在获取的脚本内部:

# script.sh
echo "$(basename "$1")"     # this is the name of the script itself
于 2016-08-30T03:20:00.863 回答