2011-05-02 98 views
5

当我在运行Mac OS X v10.6.7(Snow   Leopard)的Mac上的Bash脚本中引用$ 0时,我得到-bash,而不是脚本的名称。

我跑this Stack Overflow question描述的脚本:

#!/bin/bash 

echo 
echo '# arguments called with ([email protected]) --> '"[email protected]" 
echo '# $1 --------------------------> '"$1" 
echo '# $2 --------------------------> '"$2" 
echo '# path to me ($0) -------------> '"$0" 
echo '# parent path (${0%/*}) -------> '"${0%/*}" 
echo '# my name (${0##*/}) ----------> '"${0##*/}" 
echo 

时,会产生如下:

> . show_parms.sh foo 

# arguments called with ([email protected]) --> foo 
# $1 --------------------------> foo 
# $2 --------------------------> 
# path to me ($0) -------------> -bash 
# parent path (${0%/*}) -------> -bash 
# my name (${0##*/}) ----------> -bash 

任何想法?

回答

8

这是有道理的,因为你采购的脚本

. show_parms.sh foo 

,而不是执行它

./show_parms.sh foo 

在本answer to the same question解释的,可以使用$BASH_SOURCE知道从文件的名称哪些命令正在被采购。

+2

好吧,我是dufus。 $ BASH_SOURCE做了诡计。我也喜欢这个解决方案,因为它是可靠的,无论脚本如何被调用,都给了我所期望的。我显然没有尝试在答案中提出的一切。谢谢,Bavarious,为您提供帮助。 – 2011-05-02 02:11:06

3

$ 0返回进程的名称。通过使用。运算符,您只需将脚本读入您的bash进程并评估其包含的命令;该进程的名称仍然是“-bash”,所以这就是你所看到的。你必须实际执行脚本作为自己的过程:

chmod +x show_parms.sh 
./show_params.sh foo 

然后你会得到你所期望的。这不是OS X特有的;这只是bash(或sh)的工作方式。

+0

谢谢欧内斯特。由于我想获取脚本名称信息,无论它是如何被调用的,我将使用$ BASH_SOURCE,如下所示,这两种方式都有效。谢谢你的帮助。 – 2011-05-02 02:14:59

1

这是因为你正在使用。运营商。如果你只是输入

show_parms.sh foo 

你会得到你想要的结果。

+0

谢谢你。 $ BASH_SOURCE是我正在寻找的。谢谢你的帮助。 – 2011-05-02 02:15:34