パイプライン機能でzshの割り当てが失敗します。

パイプライン機能でzshの割り当てが失敗します。

簡単なテストケースがあります

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
% 

異なるサブシェル、異なる変数。

おすすめ記事