LINUX.ORG.RU
решено ФорумAdmin

pipe и циклы ☛ непонятное поведение

 , ,


1

1

Здравствуйте!

Для начала создадим файл tst, состоящий из трёх строк:

for i in {a..c}; do echo $i >> tst; done

Читаем:

~$
>cat tst
a
b
c
Теперь считаем строки, ничего неожиданного:
~$
>a=0; while read; do ((++a)); echo $a; done < tst; echo "Всего строк "$a
1
2
3
Всего строк 3
А вот теперь неожиданность:
~$
>a=0; cat tst | while read; do ((++a)); echo $a; done; echo "Всего строк "$a
1
2
3
Всего строк 0
(В цикле «for in *...» всё то же самое)

Вопрос: Почему переменная «a» после завершения цикла не сохраняет своё значение, что я делаю не так?

Заранее благодарен за ответы!

P.S. Newbie

while в последнем варианте - дочерний процесс, $a из него в родительском не видна

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

Большое Спасибо!

Вот так всё работает:

a=0; cat tst | { while read; do ((++a)); echo $a; done; echo "Всего строк "$a; }

Cave-Canem ()
Ответ на: комментарий от denisv

А почему не работает

export A=0; cat tst | while read; do ((++A)); echo $A; done; echo "Всего строк "$A ?

Cave-Canem ()
Ответ на: комментарий от Cave-Canem

Плюс, я надеюсь, что cat tst — это всего-лишь вырожденный пример программы-фильтра, да? В смысле, вы в курсе, что никакие внешние программы для построчного чтения файла не нужны, я надеюсь.

Zmicier ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.