轉自 http://c.biancheng.net/view/773.htmlhtml
函數中的變量是全局變量,做用域是當前進程。其餘文件中的函數中的變量在 source該文件後也能訪問。shell
除非加local函數
下面的例子中第一次echo 沒輸出zym1和zym2的值,第二次的echo能夠輸出。由於第一次執行 a=$(test1)時,shell中 $( ) 會經過subshell來執行,即fork一個新的進程來執行。因此這邊得不到值。spa
fork新的進程時,父進程的文件描述符(標準輸出、輸入、錯誤)也被子進程copy了一份.net
父進程 子進程code
0 0 stdin htm
3 1 stdout blog
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"