如何在dash中找到脚本的路径?

时间:2015-10-06 23:18:41

标签: shell unix dash-shell

我正在尝试使用源shell脚本来确定自己的位置,并且我发现这对于破折号来说这是一项艰巨的任务。

在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 个答案:

答案 0 :(得分:2)

似乎没有任何便携式(POSIX标准)方法可以做到这一点。

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

答案 1 :(得分:1)

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

答案 2 :(得分: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

答案 3 :(得分:0)

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

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

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