Конвейер (pipe) — один из самых мощных инструментов в shell-скриптинге. Он позволяет передавать данные от одной команды к другой. Однако его часто используют неэффективно.
Многие думают, что конвейер просто передаёт вывод одной команды в другую:
1. Первая команда создаёт вывод.
2. Конвейер передаёт его во вход второй команды.
3. Вторая команда получает вход.
Но на самом деле процесс сложнее:
1. Первая команда создаёт вывод.
2. Конвейер создаёт FIFO-сегмент в памяти.
3. Данные записываются в FIFO блоками.
4. Вторая команда запускается и получает данные блоками.
Каждый
| создаёт новый сегмент памяти и заново запускает команды. Например:
grep A | grep B | grep C
Лучше заменить на:
grep "A.*B.*C"
Так
grep запускается один раз, что быстрее и эффективнее. Как оптимизировать конвейеры?
- Изучите параметры команд (
egrep, gawk и др.), чтобы не передавать данные лишний раз. - Обрабатывайте данные перед циклами (
sed, awk). - Используйте встроенные функции Bash.
Что делать, если без конвейера не обойтись?
Используйте именованный конвейер (Named Pipe), чтобы избежать повторного создания памяти:
mkfifo my_pipe
cat my_pipe &
echo "данные" > my_pipe
Это особенно полезно в больших скриптах.
👉@linuxchmod