$ bash -c 'echo $0 ' foo
foo
$ bash -c 'echo $0 '
bash
Run Code Online (Sandbox Code Playgroud)
来自 bash 手册
($0) 扩展到 shell 或 shell 脚本的名称。这是在 shell 初始化时设置的。
如果使用命令文件调用 Bash(请参阅第 39 页的第 3.8 节 [Shell 脚本]),则将 $0 设置为该文件的名称。
如果 Bash 使用 -c 选项启动(请参阅第 6.1 节 [调用 Bash],第 80 页),则 $0 设置为要执行的字符串之后的第一个参数(如果存在)。
否则,它被设置为用于调用 Bash 的文件名,由参数零给出。
“否则”是什么意思?
它包括哪些情况?
它是否包括 bash 以 -c 启动而没有任何“要执行的字符串后的参数”的情况?
bash -c 'echo $0 '
根据引用中的第二种情况,我预计不会输出任何内容,但它输出bash
.
谢谢。
您引用的文档给出了三种情况:
如果
bash
使用命令文件调用,$0
则设置为该文件的名称。
(情况1)
如果
bash
以-c
选项开头,则$0
设置为要执行的字符串之后的第一个参数(如果存在)。
(案例 2;注意两个“if”,在这种情况下必须同时满足)
否则,它被设置为用于调用的文件名
bash
,由参数零给出。
(情况 3)。
“otherwise”子句涵盖了情况 1 和 2 未涵盖的任何情况:bash
不使用命令文件调用,bash
也不以-c
选项开头,或者以-c
选项开头但在后面没有任何参数要执行的字符串。
所以是的,它包括在-c
要执行的字符串之后没有任何参数的情况下启动 Bash 的情况。它还包括echo $0
从交互式 shell 运行时的基本情况,因为交互式 shell 很可能在没有命令文件或-c
选项的情况下启动。
您可以进行测试以更好地理解手册;假设我在/bin
. 我使用绝对路径来调用带有 -c 标志的 bash,如下所示:
/bin/bash -c 'echo $0'
Run Code Online (Sandbox Code Playgroud)
输出将是/bin/bash
因为我已用作/bin/bash
调用 Bash 的名称。如果我只是使用bash -c 'echo $0'
( /bin
is in my $PATH
) 那么输出只是bash
预期的那样。