17

これはバグのあるにおいがしますが、おそらく誰かがそれを説明することができます:

次のスクリプトは機能しません。出力は次のとおりです。

#!/bin/bash
GLOBAL_VAR="OLD"
myfunc() {
        echo "func before set> $GLOBAL_VAR"
        GLOBAL_VAR="NEW"
        echo "func after set> $GLOBAL_VAR"
}
myfunc | cat
echo "final value> $GLOBAL_VAR"

出力:

func before set> OLD
func after set> NEW
final value> OLD

今、離陸するだけ| catで動作します!

#!/bin/bash
GLOBAL_VAR="OLD"
myfunc() {
        echo "func before set> $GLOBAL_VAR"
        GLOBAL_VAR="NEW"
        echo "func after set> $GLOBAL_VAR"
}
myfunc
echo "final value> $GLOBAL_VAR"

出力:

func before set> OLD
func after set> NEW
final value> NEW
4

1 に答える 1

24

パイプはサブシェルを作成します。サブシェルは親の環境を変更できないとbashマニュアルに記載されています。次のリンクを参照してください。

http://www.gnu.org/software/bash/manual/bashref.html#パイプライン

http://wiki.bash-hackers.org/scripting/processtree#actions_that_create_a_subshel​​l

于 2011-07-12T11:28:55.397 に答える