源代码Bash脚本中的$ 0不返回脚本名称

Dav*_*ter 6 macos bash

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

我运行了Stack Overflow问题中描述的脚本:

#!/bin/bash

echo
echo '# arguments called with ($@) -->  '"$@"
echo '# $1 -------------------------->  '"$1"
echo '# $2 -------------------------->  '"$2"
echo '# path to me ($0) ------------->  '"$0"
echo '# parent path (${0%/*}) ------->  '"${0%/*}"
echo '# my name (${0##*/}) ---------->  '"${0##*/}"
echo
Run Code Online (Sandbox Code Playgroud)

以下是:

> . show_parms.sh foo

# arguments called with ($@) -->  foo
# $1 -------------------------->  foo
# $2 -------------------------->
# path to me ($0) ------------->  -bash
# parent path (${0%/*}) ------->  -bash
# my name (${0##*/}) ---------->  -bash
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

小智 9

这是有道理的,因为你正在寻找脚本

. show_parms.sh foo
Run Code Online (Sandbox Code Playgroud)

而不是执行它

./show_parms.sh foo
Run Code Online (Sandbox Code Playgroud)

正如在同一问题的答案中所解释的,您可以使用$BASH_SOURCE知道从中获取命令的文件的名称.

  • 好的,我是个骗子.$ BASH_SOURCE做了这个伎俩.我也喜欢这个解决方案,因为它是可靠的,无论脚本是如何被调用的,都能给我我的期望.我显然没有尝试那个答案中建议的一切.谢谢你,巴伐利亚,为你的帮助. (2认同)

Ern*_*ill 5

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

chmod +x show_parms.sh
./show_params.sh foo
Run Code Online (Sandbox Code Playgroud)

然后,您将获得期望的结果。这不是OS X专用的;这就是bash(或sh)的工作方式。