假设我们有这样的 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 的文件名,如参数零给出的那样。