[转]shell 变量的作用域

转自 http://c.biancheng.net/view/773.html

函数中的变量是全局变量,作用域是当前进程。其他文件中的函数中的变量在 source该文件后也能访问。

除非加local

下面的例子中第一次echo 没输出zym1和zym2的值,第二次的echo可以输出。因为第一次执行 a=$(test1)时,shell中 $( ) 会通过subshell来执行,即fork一个新的进程来执行。所以这边得不到值。

fork新的进程时,父进程的文件描述符(标准输出、输入、错误)也被子进程copy了一份

父进程     子进程

0                0        stdin 

3              1      stdout   

2               2    stderr

1

子进程的stdin和stderr继承了父进程的stdin和stderr,而子进程的stdout被父进程捕获,对应到文件描述符3,所以在子进程中若echo打印log 在终端会输出,用 

但是把这个log 用 >&2 重定向到标准出错,就可以在当前终端打印出来了。

function test1()
{
zym1=10
zym2=20
printf '%s\n' "$zym1"
}
a=$(test1)
echo "^^^^^^^^^^^^^a=$a   zym1=$zym1  zym2=$zym2"  

function test2()
{
zym3=10
zym4=20
}
test2
echo "^^^^^^^^^^^^   zym3=$zym3  zym4=$zym4"

 

 

 

 

posted @ 2019-11-14 10:48  yimuxi  阅读(212)  评论(0编辑  收藏  举报