我正在学习 bash 和 zsh。我遇到的一个命令是
exec
。我知道它将用提供的命令替换当前进程。据我在网上读到的信息,在exec的替换过程中,局部变量不会被继承。我测试了一下,失败了。我在 zsh 5.9
上使用 MacOS 14
。
这是我写的,
> a=2
> exec echo $a
2
process exited...
我认为这可能是由于参数扩展造成的,我尝试了以下方法
> a=2
> exec echo '$a'
$a
process exited...
由于它打印了
$a
,我猜测参数扩展没有发生。否则,单引号将被删除,并且 $a
将被视为扩展而不是字符串。
为了进一步验证变量是否被继承,我使用了
declare
命令。输出如下
> aa=2
> exec declare -p | grep aa
typeset aa=2
即使这也显示了局部变量。
既然
exec
不继承局部变量,为什么会发生这种情况呢?我不认为它只与 zsh 有关。
是的,
$a
首先展开,然后exec
接收参数echo
和2
。
使用单引号,
exec
接收参数echo
和$a
。
在
bash
中,exec declare -p
应该失败,因为 declare
是 shell 内置命令,而不是可执行文件。
在
zsh
中,命令在当前shell中执行,然后当前shell退出。不过,因为您使用了管道,所以当前 shell 是“复制”父 shell 的子 shell。如果您愿意,可以考虑继承,但这是特殊的 zsh
行为,与 POSIX 的 exec
定义无关。