为何`sh -c "export a=1&&echo $a"`无输出?子进程环境变量疑惑
为什么
sh -c "export a=2&&echo $a"输出的是1而不是2? 这问题的核心在于shell变量的展开时机,我给你拆解一下:
先看你的第一个操作:
export a=1&&echo $a
这个命令是在当前shell进程里执行的:先把环境变量a设为1,紧接着在同一个shell里读取a的值,自然输出1,完全符合预期。
再看第二个操作的问题所在:
当你执行:
sh -c "export a=2&&echo $a"
这里的双引号是关键!你的当前shell(父shell)会先解析双引号里的内容,把$a替换成它当前已经存在的值——也就是之前设置的1。所以实际上传给sh -c的命令已经变成了:
export a=2&&echo 1
子shell执行这个修改后的命令,哪怕它把a设成了2,最后执行的是echo 1,结果自然是1了。
怎么解决?
如果你想让$a在子shell里被解析,就得用单引号包裹命令字符串,单引号会阻止父shell做任何变量展开,把原始命令完整传给子shell:
sh -c 'export a=2&&echo $a'
这样子shell拿到的命令就是export a=2&&echo $a,先设置a=2再读取,就会输出2了。
简单总结:双引号会让父shell提前解析变量,单引号会保留命令的原始形态,交给子shell自己处理。
内容的提问来源于stack exchange,提问作者傅继晗
相关产品推荐
相关产品推荐

