转自 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 ' "$zym1" } a=$(test1) echo "^^^^^^^^^^^^^a=$a zym1=$zym1 zym2=$zym2" function test2() { zym3=10 zym4=20 } test2 echo "^^^^^^^^^^^^ zym3=$zym3 zym4=$zym4"