Bash测试语句中使用子shell执行赋值操作失效的原因
Bash子shell中变量赋值失效的原因
正常执行的测试代码
a=255 b=0 [[ a -eq 255 ]] && ( echo $a;echo $b ) # 输出结果: # 255 # 0
变量赋值失效的测试代码
[[ a -eq 255 ]] && ( a=0;b=255 ) echo $a # 输出:255 echo $b # 输出:0
失效原因
用()包裹命令时,Bash会创建一个子shell来执行这些命令。子shell是当前父shell的独立副本,它会继承父shell的变量,但有自己单独的变量环境。
在子shell里对a、b的赋值,只在这个子shell运行期间有效。一旦子shell执行完退出,所有在子shell里做的变量修改都会被直接丢弃,父shell里的原始变量不会有任何变化。
而用{}包裹命令时,这些命令是直接在当前shell进程里执行的,不会创建子shell,所以变量赋值会直接修改当前shell的环境,自然能生效。
内容的提问来源于stack exchange,提问作者J Zhang
相关产品推荐
相关产品推荐

