Открытый канал ID 71118586653264

Media Notes

Media Notes
- мое творчество, различная инфа о медиа пространстве. Linux, Ubuntu, Lubuntu, Debian, Arch, PCManFM-Qt, Nemo, Nautilus, Ffmpeg, ImageMagick

Открыть в MAX

Публикации за период

По реакциям

Поиск и вся лента — после бесплатной регистрации. Свои даты — по подписке; владелец канала видит их бесплатно. Сортировка по реакциям — по подписке. Зарегистрироваться

Загрузка…

Динамические файловые дескрипторы в 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
Перейти в пост Открыть в MAX Сообщить о неточности
Динамические файловые дескрипторы в Bash:

Синтаксис:
exec {fd}< file.txt

Вместо номера FD, в фигурных скобках {} используется переменная, которой присваивается первый свободный номер FD, и на него открывается файл. В данном случае для чтения, но при смене направления знака открывается операция записи
Таким образом FD используется как обычная переменная скрипта, т.е если выполнить echo $fd, то в выхлопе увидим номер созданного FD.
Главная особенность FD - все операции выполняются в оперативной памяти, и поэтому это быстрее чем использовать временные файлы, у которых механизм использования практически такой же как и в FD.
Все выше приведённые примеры также работают с динамическим FD,., только нужно заменить номер на переменную. Динамический FD появился в Bash, начиная с версии 4.4.
Просмотры: 6
Перейти в пост Открыть в MAX Сообщить о неточности
Примеры

📌Открыть файл на чтение в FD 3

exec 3< file.txt
read line <&3
echo "$line"
exec 3<&-

📌Открыть файл на запись в FD 4

exec 4> output.log
echo "Hello" >&4
exec 4>&-

📌Одновременно читать один файл и писать в другой

exec3< input.txt
exec 4> output.txt

while read -r line <&3; do
echo "[LOG] $line" >&4
done

exec 3<&-
exec 4>&-

📌Читать два входных файла одновременно

exec 3< fileA.txt
exec 4< fileB.txt

read A <&3
read B <&4

echo "A: $A"
echo "B: $B"

exec 3<&-
exec 4<&-
Просмотры: 6
Перейти в пост Открыть в MAX Сообщить о неточности
Синтаксис FD

📌Открываем FD на чтение

exec номер_FD < имя_файла

📌Открываем FD на запись

exec номер_FD > имя_файла

📌Закрываем читающий FD

exec номер_FD < &-

📌Закрываем пишущий FD

exec номер_FD > &-

📍Закрытие FD, посылает сигнал "конец файла" EOF📍

Явное назначение FD - номером может вызвать конфликт, так как выбранный вручную номер FD может быть занят библиотекой или другим скриптом, а так же при вложенных bash-функциях конфликт становится реальным.

Например, если вы выбрали FD 3, а ваш скрипт был вызван другой программой, которая тоже использует FD 3 ― поведение будет непредсказуемым.

Решение проблемы — динамические файловые дескрипторы через именование
Просмотры: 6
Перейти в пост Открыть в MAX Сообщить о неточности
Что такое файловые дескрипторы?

У каждого процесса в Linux есть три стандартных канала:
FD Назначение
0 stdin (ввод)
1 stdout (вывод)
2 stderr (ошибки)

Но процесс может иметь дополнительные дескрипторы:
3, 4, 5 … — хоть до сотен.

Это такие же каналы ввода-вывода, как и 0–2, только вы сами решаете, куда они ведут.

📌Зачем нужны дополнительные FD?

Обычное перенаправление < file может быть применено только один раз, то есть вы не можете «последовательно читать два файла» в одном цикле:

while read line; do …; done < file1 < file2 # так не работает

Более того, невозможно одновременно читать из одного файла и писать в другой ― в рамках одного while read.

Файловые дескрипторы это исправляет.
Просмотры: 8
Перейти в пост Открыть в MAX Сообщить о неточности
ВКонтакте Телеграм Одноклассники
Избранное в datool.ru

Следите за каналом в личном кабинете

Зарегистрируйтесь в datool.ru, чтобы добавить канал «Media Notes» в избранное и отслеживать его показатели.

Зарегистрироваться
Для владельцев каналов

Подтвердите свой канал

Войдите или зарегистрируйтесь в datool.ru, затем добавьте нашего бота в канал по инструкции в личном кабинете. После проверки владения замок исчезнет и вам станет доступно управление каналом.

Войти или зарегистрироваться

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти