New We are sorting MAX channels into categories and territories. Read the news
Public channel ID 71118586653264

Media Notes

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

Russia
Open in MAX

Posts for the period

By reactions

Search and the whole feed — after free registration. Custom dates — with a subscription; the channel owner sees them for free. Sorting by reactions — with a subscription. Sign up

Loading…

Динамические файловые дескрипторы в 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}>&- команда внутри >(...) будет висеть вечно, ожидая конца данных
Views: 10
Go to post Open in MAX Report an inaccuracy
Динамические файловые дескрипторы в Bash:

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

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

📌Открыть файл на чтение в 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<&-
Views: 6
Go to post Open in MAX Report an inaccuracy
Синтаксис FD

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

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

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

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

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

exec номер_FD < &-

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

exec номер_FD > &-

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

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

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

Решение проблемы — динамические файловые дескрипторы через именование
Views: 6
Go to post Open in MAX Report an inaccuracy
Что такое файловые дескрипторы?

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

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

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

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

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

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

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

Файловые дескрипторы это исправляет.
Views: 8
Go to post Open in MAX Report an inaccuracy
sobel - фильтр Собеля (пример видео, продолжение) — video, channel “Media  Notes” ▶ video
sobel - фильтр Собеля (пример видео, продолжение)

Получилось, то что хотелось. Алгоритм следующий: сначала перевели видео в монохром, а потом выполнили фильтр Собеля для зеленого слоя

ffmpeg -i inp.mp4 -vf monochrome,sobel=1 out.mp4

Результат налицо, но причина все равно не ясна, причем в фотках в формате JPEG - наблюдается та же картина, а вот в формате rgb24/rgba все играется правильно, так что тема с фильтром Собеля считаю не законченной
Views: 19
Go to post Open in MAX Report an inaccuracy
sobel - фильтр Собеля (пример видео) — video, channel “Media  Notes” ▶ video
sobel - фильтр Собеля (пример видео)

Мы явно видим, что превалирует исключительно зеленый цвет на контурах. Вопрос - а почему зеленый, ведь работают все слои. А давайте выполним фильтр только в зеленом слое(G)

ffmpeg -i inp.mp4 -vf sobel=1 out.mp4

Вот и все стало на место - фильтр сработал так как мы и ожидали. Но наверное этот факт не дает ответа - почему фильтр с параметрами по умолчанию ведет себя странно, и для этого мы разберем работу фильтра на просто изображении
Views: 12
Go to post Open in MAX Report an inaccuracy
sobel - фильтр Собеля (примеры) — video, channel “Media  Notes” ▶ video
sobel - фильтр Собеля (примеры)

Для примера мы взяли наше видео и прогнали через фильтр Собеля с параметрами по умолчанию Фильтр сработал, но почему то вылез везде зеленый цвет
Исходно параметры видео-стрима

Stream #0:0[0x1](eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, smpte170m, progressive), 230x306, 185 kb/s, 30 fps, 30 tbr, 15360 tbn (default)

Обычный общепринятый кодек H264, а так же стандарт видео NTSC-М
Но результат удивил. Давайте разбираться
Views: 12
Go to post Open in MAX Report an inaccuracy
sobel - фильтр Собеля

Ffmpeg имеет возможность применить фильтр Собеля к видео

Фильтр Собеля — это основанный на градиенте оператор обнаружения границ, который выявляет сильные изменения в первой производной изображения, что делает его основополагающим инструментом в обработке изображений и компьютерном зрении для обнаружения границ объектов и важных структурных свойств на изображениях.

ffmpeg -i вход -vf sobel выход


У фильтра есть следующие опции
📍planes - слои
Устанавливает слой в котором применяется фильтр, в противном случае слой копируется. Всего слоев 4 и поэтому по умалчанию используются все слои, т.е = 0xF (15 - десятеричная)
Слои нумеруются битовой маской и соответствуют G(зеленый) = 1, B(синий)= 2, R(красный)= 4, A(альфа канал) = 8; что означает по умолчанию Собель выполняется во всех каналах
📍scale
Коэффициент умножения результата, по умолчанию = 1
📍delta
Добавление константы к результату, по умолчанию = 0

Опции задаются двумя способами - явная форма

sobel=planes=маска_слоя,scale=коэффициент,delta=константа

причем любая опция может отсутствовать или обязательная форма

sobel[=маска_слоя[:коэффициент[:константа]]]
Views: 13
Go to post Open in MAX Report an inaccuracy
Команда pstree показывает дерево процессов — то есть какие процессы запустили другие процессы.

Удобнее, чем обычный ps, потому что видно иерархию.

Базовое использование: pstree

Пример вывода:
systemd─┬─NetworkManager
├─sshd─┬─sshd───bash───pstree
│ └─sshd───bash
└─cron

Что это значит:
• systemd — главный процесс системы (PID 1)
• он запустил:
- NetworkManager
- sshd
- cron
• sshd запустил bash
• из bash запустили pstree
То есть видно кто чей родитель.

Полезные опции:
• Показать PID процессов: pstree -p
• Показать пользователей: pstree -u
• Показать аргументы процессов: pstree -a
• Дерево конкретного процесса: pstree <PID>
• Подсветка текущего процесса: pstree -h
Views: 18
Go to post Open in MAX Report an inaccuracy
The full feed — after free sign-up
VKontakte Telegram Odnoklassniki
Favorites at datool.ru

Follow the channel in your account

Sign up at datool.ru to add the channel “Media Notes” to favorites and track its metrics.

Sign up
For channel owners

Verify your channel

Sign in or sign up at datool.ru, then add our bot to the channel following the instructions in your account. Once ownership is verified, the lock disappears and channel management becomes available.

Sign in or sign up

Report an inaccuracy

Describe what needs fixing. If you have a source, add a link.

You are leaving datool.ru

The link leads to an external website. datool.ru is not responsible for its content — check the address before entering passwords or payment details.

Redirecting in 10 s

Go