`exec` 正在访问局部变量

问题描述 投票:0回答:1

我正在学习 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 有关。

bash zsh exec
1个回答
0
投票

是的,

$a
首先展开,然后
exec
接收参数
echo
2

使用单引号,

exec
接收参数
echo
$a

bash
中,
exec declare -p
应该失败,因为
declare
是 shell 内置命令,而不是可执行文件。

zsh
中,命令在当前shell中执行,然后当前shell退出。不过,因为您使用了管道,所以当前 shell 是“复制”父 shell 的子 shell。如果您愿意,可以考虑继承,但这是特殊的
zsh
行为,与 POSIX 的
exec
定义无关。

© www.soinside.com 2019 - 2024. All rights reserved.