为什么 `bash -c 'echo $0 ' ` 输出“bash”?

为什么 `bash -c 'echo $0 ' ` 输出“bash”?
$ bash -c 'echo $0 ' foo 
foo

$ bash -c 'echo $0 '  
bash

来自 bash 手册

($0) 扩展为 shell 或 shell 脚本的名称。这是在 shell 初始化时设置的。

如果使用命令文件调用 Bash(请参见第 39 页第 3.8 节 [Shell 脚本]),则 $0 将设置为该文件的名称。

如果 Bash 使用 -c 选项启动(请参见第 80 页第 6.1 节 [调用 Bash]),则 $0 设置为要执行的字符串后面的第一个参数,如果有人在场的话。

否则,它被设置为用于调用 Bash 的文件名,由参数零给出。

“否则”是什么意思?

其中包括哪些案例?

它是否包括bash以-c启动而没有任何“要执行的字符串后面的参数”的情况?

bash -c 'echo $0 '根据引用中的第二种情况,我预计不会输出任何内容,但它输出了bash.

谢谢。

答案1

您引用的文档给出了三种情况:

如果bash使用命令文件调用,则$0设置为该文件的名称。

(情况1)

如果bash以选项开始-c,则$0设置为要执行的字符串之后的第一个参数(如果存在)。

(情况2;注意两个“if”,在这种情况下必须都满足)

否则,它被设置为用于调用的文件名bash,由参数零给定。

(案例3)。

“otherwise”子句涵盖了情况 1 和 2 未涵盖的任何情况:bash不使用命令文件调用,也不bash-c选项开头,或者以选项开头-c但后面没有任何参数要执行的字符串。

-c所以,是的,它包括 Bash 启动时在要执行的字符串之后不带任何参数的情况。它还包括从交互式 shell 运行时的基本echo $0情况,因为交互式 shell 很可能是在没有命令文件或-c选项的情况下启动的。

答案2

您可以进行测试以更好地理解手册;假设我在/bin.我使用绝对路径通过 -c 标志调用 bash,如下所示:

/bin/bash -c 'echo $0'

输出将是/bin/bash因为我已用作/bin/bash调用 Bash 的名称。如果我只使用bash -c 'echo $0'( /binis in my $PATH) 那么输出就是bash预期的。

答案3

据我所知,bash 手册没有描述这种情况下会发生什么。如果bash -c COMMAND没有要分配的参数,会发生什么情况$0,即$0设置为用于调用 bash 的文件名,与既没有脚本也没有-c选项时相同。

这是标准行为,由 POSIX 编码

有关“否则”的含义,请查阅英语词典。

相关内容