之前因为一些问题专门搜索了一些关于shell变量作用域的问题,并且通过实践表明shell变量的确和所熟知的C语言Java等语言的变量作用域有不同之处
因为shell变量默认都是全局变量
作用域的范围从变量的定义一直到shell的结束或者是该变量的删除(unset)
如果脚本中使用function,那这一特点就比较明显了,
因为你会发现定义在function内部的变量,在函数外也会是生效的,而不是默认为局部变量
除非使用关键字local进行声明
好,在了解以上特性之后遇到了另外一件事
案例1:
function aaa(){
bbb=12345
}
bbb=''
aaa
echo ${bbb}
案例2:
function aaa(){
bbb=12345
}
bbb=''
aaa | tee aaa.log
echo ${bbb}
然而案例1的结果是
[aicappjj@AIC4-JIUJBANK-YL tmp]$ sh test.sh
12345
[aicappjj@AIC4-JIUJBANK-YL tmp]$
案例2的结果是
[aicappjj@AIC4-JIUJBANK-YL tmp]$ sh test.sh
[aicappjj@AIC4-JIUJBANK-YL tmp]$
对,啥都没有
经过试验重定向符号>以及2>&1各种重定向都没有这个问题
然而就是管道符|会出现这个问题
猜想问题的原因是管道符|相当于生成了一个新的子进程
就视它为在脚本里面加了一个sh 执行子脚本的过程
具体资料支持还并没有找到,初稿后续补充