Да. Смотрите этот документ .
В разделе «Shell and Utilities» в POSIX.1-2017 описываются команды и утилиты, предлагаемые прикладным программам в POSIX-совместимых системах.
От 2.9.2 Трубопроводы :
Конвейер представляет собой последовательность из одной или нескольких команд, разделенных оператором управления '|'.
С 2.9.5 Команда определения функции :
Функция - это пользовательское имя, которое используется как простая команда [...]
Формат команды определения функции следующий:
fname ( ) compound-command [io-redirect ...]
Из 2.9 Команды оболочки :
Команда является одной из следующих:
- Простая команда [...]
- [...]
Так |
отделяет команды; команда может быть простой командой; Имя функции используется как простая команда. Ответ на ваш вопрос: да, этот синтаксис
some_command | some_function
определяется POSIX.
Это довольно просто попробовать (протестировано с sh
помощью dash
в Debian 9):
mygrep() { grep "$@"; } if ps | mygrep foo ; then echo "process foo is running" fi if ps | mygrep ps ; then echo "process ps is running" fi
( ps | mygrep foo
также обнаружит процесс foobar
, если таковой имеется. Я понимаю, что эта проблема выходит за рамки вашего вопроса, и мы можем ее игнорировать).
В этом примере mygrep
это тривиально. Возвращает статус выхода своей последней (и единственной) команды. При построении функций с более сложной логикой вам может потребоваться специальная встроенная функция return
для возврата желаемого состояния выхода.
Также обратите внимание, что вывод из grep
не подавляется. В каналах можно использовать не только функцию оболочки, но и ее вывод. Пример:
if ps | mygrep ps >/dev/null ; then echo "process ps is running" fi