|
|
|
|
 |
locsemege
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
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
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!
|