Keresés

Részletes keresés

NevemTeve Creative Commons License 2005-11-04 11:29:07 33
echo -e 'aa\nbb' | ( (read x; echo $x); read y; echo $y)
Egészen pontosan mi ezzel a gond? Az össes "read" stdin-je az lesz, amit az "echo"-tól kap... ezen a zárójelek nem változtatnak, pl
echo -e 'aa\nbb' | { read x; echo $x; read y; echo $y; }
ugyanazt eredményezi
A hozzászólás:
locsemege Creative Commons License 2005-11-04 10:58:37 32
Ez ugyan jól hangzik, csak az a baj, hogy ha a külső ciklus elindul a pipe miatt egy önálló processzben - és ennek valóban így kell lennie -, a belső ciklusnak nincs oka önállósodni. De ha igen, még akkor is zavaros számomra, mert a belső ciklus read-je - jelen esetben éppen a feladatnak megfelelően ugyan - ugyanabból az stdinből szedi fel az adatot, ahonnan a külső ciklus read-je. Viszont a két ciklus között az echo-val az stdout-ra piszkítottam, s azt vártam, hogy a belső read-je ezt néha visszaszedi, és ezért hibás lesz a működés. Azonkívül az stdin-t, stdout-ot és stderr-t nem szokta meghatni a különprocessz.

Példa:

echo a | (read x; echo $x)
a

echo b | (sleep 1; (read x; echo $x); )
b

Az echo a | read x; echo $x nem működik "jól", de ez azért van, mert a read a pipe miatt subshell-ben futva ott hozza létre az x változót, amely a programra nézve lokális, a subshellből való kilépéskor annak memóriaterülete az x értékével együtt felszámolódik. Ez világos.

Amit nem egészen értek, az ez:

echo -e 'aa\nbb' | ( (read x; echo $x); read y; echo $y)
aa
bb

holott nem lennék meglepve az
aa
aa

válaszon sem, hiszen az az echo $x aa-ját a read y akár fel is szedhetné. Kipróbáltam még ezt is:

echo -e 'aa\nbb' | ( (read x; echo $x); read y z; echo $y $z)
aa
bb

de szó sincs arról, hogy csak a sorrend miatt van így, s a pipe-on maradt volna az aa. Bár ez nem túl meglepő, mert akkor nem íródott volna ki a terminálra az első sorban. Ingoványos ez nekem, tényleg nem tiszta teljesen. :(
Előzmény:
Zahy Creative Commons License 2005-11-04 10:07:20 31
Mert a pipe miatt a ciklusod al-shell-ben - magyarul masik shell-ben - fut. (Ha esetleg utanakeresel, akkor megtalalhato, hogy az echo a | read x ; echo "$x" legtobb shellben "jol" mukodik (kiveve pl. pdksh), de ha ciklus van, akkor mar nem. Explicite persze nem sok helyen irjak le.)

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!