Process substitution в Bash: оптимизация скриптов

Практические лайфхаки для разработчиков, DevOps и админов: Docker, Linux, Bash, Python, Golang, Ansible, логи и безопасность — только рабочие решения. Даем готовые команды, конфиги и приёмы диагностики, которые экономят часы и дни. Если нужно быстро настроить, отладить и обезопасить инфраструктуру — вы по адресу.

bashprocess substitutionскрипты

ℹ️ Если часто пишете Bash-скрипты, вы наверняка используете пайпы для передачи данных между командами. Однако, существует один продвинутый прием, который не так часто обсуждается – process substitution. Этот механизм позволяет работать с данными в виде файлов без необходимости их фактического создания на диске, что значительно ускоряет выполнение скриптов.

Как это работает?

Process substitution создает временные файловые дескрипторы для ввода или вывода данных, заменяя традиционные пайпы.

🖥 Пример с использованием обычных пайповв:

cat file1.txt | grep 'pattern' | sort > result.txt

ℹ️ В этом примере сначала создается пайп между cat и grep, потом между grep и sort. Это подходит для простых случаев, но при работе с большими файлами или сложными сценариями пайпы могут становиться узким местом по производительности.

📂 А вот как то же самое можно сделать с process substitution:

sort <(grep 'pattern' file1.txt) > result.txt

ℹ️ Здесь grep 'pattern' file1.txt выполняется в процессе подстановки, а sort напрямую работает с результатом через временный файловый дескриптор. Это избавляет от необходимости передачи данных через несколько пайпов, уменьшая накладные расходы на запуск новых процессов.

💎 Пример сложного использования:

Предположим, у вас есть два больших файла, и вам нужно найти строки, присутствующие в обоих файлах, отсортировать их и записать результат в файл:

comm -12 <(sort file1.txt) <(sort file2.txt) > common_lines.txt

ℹ️ comm сравнивает отсортированные файлы и выводит совпадения. Здесь process substitution позволяет передавать сортированные данные напрямую без создания временных файлов.

✳️ Преимущества:

  • - Быстрее при больших объемах данных: process substitution создает файлы в оперативной памяти, что уменьшает нагрузку на диск.
  • - Читаемость кода: код с process substitution становится легче читать, так как вы явно указываете, какие данные передаются на вход каждой команде.

tags: #полезно #bash #linux

🧭 @recura_tech

Скриншот терминала в тёмной теме с примерами команд Bash: process substitution, sort, grep и comm; видны строки кода и подсветка синтаксиса.
Терминал с примером использования process substitution для сортировки и сравнения файлов.

Читайте так же