当你通过管道传输数据到 bash 时,“$0”会发生什么

当你通过管道传输数据到 bash 时,“$0”会发生什么

假设我们有这样的 bash 文件:

cd $(dirname "$0");

当我们读取文件然后通过 bash 通过管道传输它时会发生什么,而不是直接执行文件? “$0”如何解释?

echo "$(cat <file>)" | bash

我问的原因是因为似乎不清楚 $0 的含义,因为该文件不再一定在它曾经所在的位置运行。也许 bash 会记住它所在的位置,并且 $0 仍然指原始文件位置?看起来可能性很小。

答案1

$0那么将是调用 bash 的名称:

$ printf '%s\n' 'echo $0' | bash
bash
$ printf '%s\n' 'echo $0' | ARGV0=sh bash
sh
$ printf '%s\n' 'echo $0' | ARGV0='blah blah' bash
blah blah

第二个和第三个命令在 zsh 中运行,它允许您使用特殊变量 设置第 0 个参数ARGV0。但您可以通过使用符号链接来模拟:

$ ln -s "$(command -v bash)" foo
$ printf '%s\n' 'echo $0' | ./foo
./foo

bash 手册

($0) 扩展为 shell 或 shell 脚本的名称。这是在 shell 初始化时设置的。如果使用命令文件调用 Bash(请参阅 外壳脚本),$0设置为该文件的名称。如果 Bash 使用该选项启动-c(请参阅调用 Bash),然后$0设置为要执行的字符串之后的第一个参数(如果存在)。否则,它被设置为用于调用 Bash 的文件名,如参数零给出的那样。

相关内容