TGViewer
BashTex | Linux BashTex | Linux @bash_tex · 2.51K subscribers
Post #570 638
Почему while read ломается в пайпах

Классическая ловушка Bash:


count=0

cat file.txt | while read -r line; do
((count++))
done

echo "$count"


Ожидание: увидим количество строк.
Реальность: 0.

▪️ Что произошло

Когда while read стоит справа от пайпа, цикл часто выполняется в subshell - дочернем процессе. То есть переменная count меняется не в текущем shell, а в его копии. После окончания цикла изменения исчезают.

▪️ Как делать правильно. Вариант 1: редирект файла вместо pipe


count=0

while IFS= read -r line; do
((count++))
done < file.txt

echo "$count"


Теперь цикл работает в текущем shell, и count сохраняется.

Вариант 2: process substitution. Если источник - команда, а не файл:


count=0

while IFS= read -r line; do
((count++))
done < <(grep ERROR app.log)

echo "$count"


<(...) подставляет вывод команды как файл, без subshell-проблемы в самом цикле.

▪️ Почему это важно

Ломаются не только счетчики. Точно так же исчезают:, массивы, флаги, накопленные строки и любые переменные, измененные внутри цикла

BashTex 📱 #bash
  • 👍 11
More from @bash_tex
  1. Oct 7, 2026/dev/tcp - сетевое соединение средствами Bash В Bash есть малоизвестная возможность работа…
  2. Oct 6, 2026Ephemeral ports - почему заканчиваются исходящие TCP-порты Когда приложение устанавливает…
  3. Oct 5, 2026name_to_handle_at() - как получить файловый объект без обычного пути В Linux обычно обраща…
  4. Oct 2, 2026madvise() - как процесс подсказывает ядру, как он собирается использовать память Когда про…
  5. Oct 1, 2026flock vs fcntl - почему две блокировки одного файла могут вести себя совершенно по-разному…
  6. Sep 30, 2026DEBUG trap - как Bash выполняет код перед каждой командой В Bash есть специальный DEBUG tr…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →