Динамические файловые дескрипторы в Bash
(продолжение)
Главная особеность динамических файловых дескрипторов - работа с подстановкой потоков процессов (Process Substitution). Этот механизм создает динамический файловый дескриптор (обычно в /dev/fd/63 или /dev/fd/62), связанный с пайпом (pipe), и передает его имя команде.. Эта возможность появилась в BASH с версии 5.2.15.
Пример
# создаем дескриптор процеса
exec {FD}< <(sed 's/foo/bar/g' data.txt)
# читаем построчно и обрабатываем каждую строку+вывод в stdout
while IFS= read -r line; do
echo "Получена строка: $line"
done <&$FD
# закрываем пайп процесса
exec {FD} >&-
В качестве процесса может использоваться любая сложная операция, вплоть до сбора информации со сторонних датчиков, где реально нет в данных конца файла, и саму операцию нужно прекратить по другому принципу в момент обработки, выйдя из цикла. Вот тогда команда закрытия пайпа процесса выдаст EOF (конец файла)
Файловый дескриптор процесса может быть создан и для записи в процесс
Пример
# Открываем подстановку процесса на запись
exec {FD}> >(sed 's/123/456/g' > final.txt)
# Теперь {FD} содержит номер (например, 63)
echo "Обрабатываем первую часть" >&"$FD"
echo "Обрабатываем вторую часть" >&"$FD"
# ВАЖНО: Закрываем дескриптор, чтобы sed внутри скобок понял, что данных больше не будет и завершился
exec {FD}>&-Без закрытия дескриптора exec {FD}>&- команда внутри >(...) будет висеть вечно, ожидая конца данных
Просмотры: 10