|
|
ru.unix- RU.UNIX ---------------------------------------------------------------------- From : Valentin Nechayev 2:5020/400 04 Jun 2002 22:39:54 To : eugen@grosbein.pp.ru Subject : Re: shell question -------------------------------------------------------------------------------- >>> Eugene Grosbein wrote: > #!/bin/sh > > echo RIGHT | ( > v=notfound > while read name > do > v=$name > done > echo debug: $v 1>&2 > echo $v > ) | read v > echo final: $v > > Выдает: > > debug: RIGHT > final: > > Почему не срабатывает такой способ передачи данных из subshell наверх? Совершенно стандартная грабля. Шелл не может справиться в одном процессе со сложностью ситуации и порождает субпроцесс. Вот вывод ktrace: 1002 ktrace CALL execve(0xbfbff70c,0xbfbffbd8,0xbfbffbe4) 1002 ktrace NAMI "/bin/sh" 1002 sh RET execve 0 [...] 1002 sh CALL fork 1002 sh RET fork 1005/0x3ed 1002 sh CALL close(0x4) 1002 sh RET close 0 1002 sh CALL close(0xffffffff) 1002 sh RET close -1 errno 9 Bad file descriptor 1002 sh CALL getpgrp 1002 sh RET getpgrp 1002/0x3ea 1002 sh CALL wait4(0xffffffff,0xbfbffadc,0x2,0) 1003 sh RET fork 0 [...] 1003 sh CALL exit(0) 1002 sh RET wait4 1003/0x3eb 1002 sh CALL wait4(0xffffffff,0xbfbffadc,0x2,0) 1004 sh RET fork 0 [...] Hа bash то же самое с мелкими изменениями. Интересно, что $$ во всех этих субпроцессах тот же, что и в начальном. Workaround - передавать через файл. Иных вариантов фактически нет. Hу или выбрось каку и пиши на каком-нибудь перле. /netch --- ifmail v.2.15dev5 * Origin: Dark side of coredump (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix/7368fe2a27a1.html, оценка из 5, голосов 10
|