[轉]shell 變量的做用域

轉自 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"
相關文章
相關標籤/搜索