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.
- 1339 megtekintés
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
- A hozzászóláshoz be kell jelentkezni
A zárójelezés jó ötlet, de ekkor is külön shell indul, így a váltózó értékeket ugyanúgy nem lehet utána elérni.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Igen, file-ba tolom, akkor valóban tuti. Köszi mindkettőtöknek.
- A hozzászóláshoz be kell jelentkezni