[megoldva] bash: for ciklus - pipe - namespace

Fórumok

Sziasztok,

Adott az alábbi szkript:

list="a b";i=99;j=99

echo "BEGIN i=$i j=$j"
for s in $list ; do
echo -n "$s ==> i=$i j=$j k=$k"
i=0; j=0; k=0
echo " utana i=$i j=$j k=$k"
done | tee /tmp/tmp
echo "END i=$i j=$j k=$k"

Ami ezt a kimenetet produkálja:

BEGIN i=99 j=99
a ==> i=99 j=99 k= utana i=0 j=0 k=0
b ==> i=0 j=0 k=0 utana i=0 j=0 k=0
END i=99 j=99 k=

Azt látom, hogy mi történik csak nem értem hogy miért. A for ciklus belseje kvázi másik namespace-ben fut le. Megkapja a válozók értékeit, de amikor végez, a változók visszaállnak a ciklus előtti értékekre. Pipe tee nélkül egy namespace-ben fut az egész szkript, ahogy várnám és a változók a ciklus után is megőrzik az értékeket, amitet kaptak belül.

1.) Miért csinálja ezt?
2.) Hogy tudom megoldani, hogy a ciklus után megmaradjanak a változó értékek?

Jó lenne elkerülni, hogy minden kimenetet generáló sor végére egyesével kelljen odaírni a tee-t.

Hozzászólások

Szerintem nem külön namespace-ben fut, hanem külön shellben, a kimenet átirányítás miatt a bash forkol egy subshellt.

Ha sok lomot kellene egyben átirányítani, akkor zárójelek közé kell tenni és azt tolni tee-be.

(
nagyobb program
) | tee akarmi

kulon shellben fut a pipe utani resz, ami orokli a valtozok erteket de visszafele nyilvan nem tudja adni oket.

nekem anno mikor ilyennel szivtam, az volt a workaround, hogy a pipe utani resz kiirta stdout-ra a szamomra erdekes valtozot, es az egeszet beleraktam egy valtozo=$( ... | ... ) koze. gany a kobon, de mukodott :)

masik lehetoseg, hogy valami temp fileba irod a pipe elotti kimenetet aztan filekent iranyitod bele a pipe utaniba, tehat kihagyod a pipe-ot. igy nem kell kulon subshell.

A'rpi