exec命令是否继承本地变量?Shell实测疑惑求解
关于exec命令与本地变量继承的疑问解答
首先明确核心逻辑:shell执行exec命令时,会先完成当前shell的参数扩展、变量替换、管道前命令执行等操作,再启动新进程替换自身。你的测试结果和“exec替换后的进程不继承本地变量”的结论并不冲突,具体拆解如下:
测试1:
exec echo $a
执行这条命令时,当前zsh会先把$a替换成它的值2,再调用exec启动echo进程。此时echo接收的参数已经是字符串"2",新进程根本不需要感知a变量,只是打印传入的参数而已。测试2:
exec echo '$a'
zsh的参数扩展规则中,单引号内的内容不会被解析替换,所以传递给echo的参数就是原始字符串$a,自然输出$a——这是shell引号特性导致的,和exec本身无关。测试3:
exec declare -p | grep aa
管道前的declare -p是当前shell进程内执行的,在exec启动新进程替换自身之前,当前shell已经完成了declare -p的执行并输出结果,再通过管道传给grep。也就是说declare -p并没有在新进程中运行,它是当前shell在替换前完成的操作,所以能查到本地变量aa。
如果要验证“新进程不继承本地变量”的结论,可以用这种方式测试:
a=2 exec zsh echo $a # 此时会发现a无值,新zsh进程是独立的,不会继承原shell的本地变量
这才是网上资料所指的场景——新启动的独立进程(如全新shell)无法获取原shell的本地变量,而你之前的测试都利用了当前shell在exec执行前的解析、执行特性。
内容的提问来源于stack exchange,提问作者Dhruv
相关产品推荐
相关产品推荐

