TGViewer
BashTex | Linux BashTex | Linux @bash_tex · 2.52K subscribers
Post #635 471
read -d: как читать Bash-поток не по строкам

read обычно ждёт перевод строки:

while IFS= read -r line; do
printf '%s\n' "$line"
done < file.txt


Но у read можно изменить разделитель. Это особенно полезно для данных, где обычный \n не является надёжной границей записи.

▪️Читать по нулевому байту

Например, find умеет выдавать имена файлов через \0:

find /tmp -type f -print0 |
while IFS= read -r -d '' file; do
printf '%s\n' "$file"
done


-d '' означает: читать до NUL-символа.

Это позволяет корректно обработать имя вроде:

report
2026.txt


где внутри имени действительно может быть перевод строки.

▪️Почему обычный read здесь опасен

Такой вариант:

find /tmp -type f -print0 |
while read -r file; do
...
done


не соответствует формату данных: find разделяет записи \0, а read по умолчанию ищет \n.

▪️Можно использовать другой разделитель

Например, прочитать значения через

::
while IFS= read -r -d ':' value; do
printf '<%s>\n' "$value"
done <<< 'one:two:three:'


Получим:

<one>
<two>
<three>


▪️read умеет ещё и ограничивать количество символов

IFS= read -r -n 1 char


Теперь Bash прочитает только один символ.

А:

IFS= read -r -N 8 chunk


будет ждать ровно 8 символов, не считая разделитель строки.

▪️Где это полезно

read -d особенно хорошо сочетается с командами, поддерживающими NUL-разделители:

find ... -print0
git ... -z
sort -z
xargs -0


Получается безопасная цепочка, в которой пробелы, кавычки и даже переводы строк внутри имён файлов не ломают обработку.

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

Разделитель данных должен совпадать с тем, как эти данные реально генерируются. read - это не только «прочитать строку»: с -d, -n и -N он может работать с потоками гораздо точнее.

BashTex 📱 #bash #linux
  • 👍 5
More from @bash_tex
  1. Oct 6, 2026Ephemeral ports - почему заканчиваются исходящие TCP-порты Когда приложение устанавливает…
  2. Oct 5, 2026name_to_handle_at() - как получить файловый объект без обычного пути В Linux обычно обраща…
  3. Oct 2, 2026madvise() - как процесс подсказывает ядру, как он собирается использовать память Когда про…
  4. Oct 1, 2026flock vs fcntl - почему две блокировки одного файла могут вести себя совершенно по-разному…
  5. Sep 30, 2026DEBUG trap - как Bash выполняет код перед каждой командой В Bash есть специальный DEBUG tr…
  6. Sep 29, 2026tee + process substitution: один поток и несколько получателей Иногда нужно одновременно:…
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 →