2016-09-07 7 views
1

私はbashに慣れていないので、私は困惑させるケースに会いました。Bash。可変可視性と生涯

-------point 1-------- 

-------point 2-------- 
El 1 
El 3 
El 2 
var value 

あなたが見ることができるように、関数f1は、2つの異なる方法で呼ばれていたし、彼らは非常に異なる影響を与える:

f1() 
{ 
    ar+=(1) 
    ar+=(3) 
    ar+=(2) 
    var="var value" 
    echo "0" 
} 

f2() 
{ 

    res=$(f1) 
    echo -------point 1-------- 
    for i in ${ar[@]}; do 
     echo "El $i" 
    done 
    echo $var 

    echo -------point 2-------- 
    f1>/dev/null 
    for i in ${ar[@]}; do 
     echo "El $i" 
    done 
    echo $var 
} 

f2 

このスクリプトは、次のような結果を生成します。それは、このような場合の例です。最初の呼び出しでは、f1で宣言された配列と変数は明らかに破壊されました。 2番目の方法では、配列と変数が保存されました。

誰でも私に説明したり、適切なマニュアルへのリンクを教えてもらえますか?

答えて

4

あなたがこれを行うとき:

res=$(f1) 

あなたは、サブシェルを作成サブシェル内部f1を実行し、変数$resに出力を格納します。そのサブシェル内で作成された変数は、閉じた後に失われます。これを行うと

f1>/dev/null 

現在のシェル内f1を実行します。関数内で作成された変数はグローバルスコープにあるため、後でアクセスすることができます。