簡単なテストケースがあります
local testa=("a")
local testb=("b")
function test { testb=(${(P)1}) }
test "testa"
echo "testb="$testb
出力testb=a
と
local testa=("a")
local testb=("b")
function test { testb=(${(P)1}) }
test "testa" | cat
echo "testb="$testb
出力は次のとおりですtestb=b
私は同じ結果を出力に適用する必要があると仮定しますtestb=a
。
何が問題なの?
ベストアンサー1
パイプは、変数の変更が親シェルから隠されるサブシェルを導入します。while
ループ内の変数の変更が親項目に影響しないパイプを含むループ。モジュールを介してPIDの変更を観察できますzsh/system
。
zmodload zsh/system
local testa=("a")
local testb=("b")
function test {
testb=(${(P)1})
echo "INSIDE testb=$testb $sysparams[pid]"
}
test "testa" | cat
echo "OUTSIDE testb=$testb $sysparams[pid]"
次のように表示する必要があります
% zsh foo.zsh
INSIDE testb=a 61488
OUTSIDE testb=b 61487
%
異なるサブシェル、異なる変数。