Keresés

Részletes keresés

locsemege Creative Commons License 2005-11-04 11:41:54 34
Az a kérdésem, hogy a subprocesszen belüli echo által az stdout-ra küldött adatot az echo-t követő read miért nem olvassa fel? Bár igaz, ebben az esetben ez sem működne:

while read a; do echo "xx$axx"; done </etc/fstab

hiszen az echo elrontaná a következő alkalommal futó read számára az adatot. Azért egy kis homálytizedelést tarthatnál erről. Persze jó, hogy így működik, csak nem teljesen világos, hogy miért.
A hozzászólá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
Előzmény:
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. :(

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