LINUX.ORG.RU

Проблема с while read

 ,


0

2

В скрипте из-за цикла while read есть две проблемы:

1) Если во время запущенного скрипта ввести что-то с клавиатуры, оно не набирается (например набрать exit или любую новую команду во время работающего не получится).

2) Не передаются переменные из цикла while read в вызываемую trap'ом функцию.

Вторую проблему "обошёл", заменив while read на цикл for.

Но в скрипте есть место, где нужен именно while read из-за обработки файлов с пробелами в именах, для чего for не подходит.
Как быть?

★★★★★

Последнее исправление: teod0r (всего исправлений: 1)

Ответ на: комментарий от aedeph_

спс IFS=«$(printf '\n\t')» то что надо

teod0r ★★★★★
() автор топика
Ответ на: комментарий от teod0r

help read

-u fd read from file descriptor FD instead of the standard input

это в теле цикла.

По поводу второго вопроса показывай код. Вангую, ты делаешь

cat file | while read v; do ... done

угадал? Ну вот ты неправильно делаешь.

emulek
()
Ответ на: комментарий от emulek

cat file | while read v; do ... done

угадал? Ну вот ты неправильно делаешь.


ну почти, греп. почему не правильно?

help read

-u fd read from file descriptor FD instead of the standard input

это в теле цикла.


всмысле в теле? не while read -u? можно подробнее, с примером?

teod0r ★★★★★
() автор топика
Ответ на: комментарий от teod0r

ну почти, греп. почему не правильно?

у тебя цикл в отдельном fork'е. Мало того, что тормозит, дык ещё и переменные недоступны.

всмысле в теле? не while read -u? можно подробнее, с примером?

нет. Просто ты перенаправляешь ввод в цикл, т.е. во внешнюю read. И во внутреннюю read тоже идёт этот перенаправленный ввод.

нигде в манах read нету флага -u

это встроенная команда bash. См. help read.

Пример позже напишу.

emulek
()
Ответ на: комментарий от teod0r

да, можно и наоборот сделать, т.е. перенаправить весь выхлоп grep куда-то в &5 поток, а потом внешней read читать &5.

Вообще нагугли ABS, там всё написано.

emulek
()
Ответ на: комментарий от emulek

спс.

а можешь напомнить, ты писал про конструкцию что-то типа echo траляля > > $(программа) как правильно не помню, оно не гуглится и поиском ЛОРа '<' и '>' не ищатся ?

teod0r ★★★★★
() автор топика
Ответ на: комментарий от teod0r
drb@amilo:~/tmp/z$ echo "test" >t
drb@amilo:~/tmp/z$ echo <(cat t)
/dev/fd/63
drb@amilo:~/tmp/z$ while read VAR; do echo $VAR; done < <(cat t)
test

да, cat тут просто для примера. IRL там что-то другое. Как можно заметить, <() это просто имя файла. А файл представляет собой /dev/stdout того, что в скобках(cat в данном случае).

emulek
()
Ответ на: комментарий от teod0r

а вот пример того, почему я не делаю таких конвейеров:

# внутри цикла я меняю $S
$ S="S1"; cat t | while read V; do echo "V=$V S=$S"; S="S2"; done; echo "S=$S"
V=test S=S1
S=S1 # но она НЕ меняется

$ S="S1"; while read V; do echo "V=$V S=$S"; S="S2"; done< <(cat t); echo "S=$S"
V=test S=S1
S=S2 # УМВР
emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.