Vâng. Xem tài liệu này .
1. Giới thiệu
Khối lượng Shell và Tiện ích của POSIX.1-2017 mô tả các lệnh và tiện ích được cung cấp cho các chương trình ứng dụng bởi các hệ thống tuân thủ POSIX.
Từ 2.9.2 Đường ống :
Đường ống là một chuỗi gồm một hoặc nhiều lệnh được phân tách bởi toán tử điều khiển '|'.
Từ lệnh 2.9.5 Định nghĩa hàm :
Hàm là tên do người dùng định nghĩa được sử dụng như một lệnh đơn giản [...]
Định dạng của lệnh định nghĩa hàm như sau:
fname ( ) compound-command [io-redirect ...]
Từ 2.9 Lệnh Shell :
Một lệnh là một trong những điều sau đây:
- Lệnh đơn giản [...]
- [...]
Vì vậy, |
tách các lệnh; một lệnh có thể là một lệnh đơn giản; Tên hàm được sử dụng như một lệnh đơn giản. Câu trả lời cho câu hỏi của bạn là: có, cú pháp này
some_command | some_function
được định nghĩa bởi POSIX.
Đó là khá dễ dàng để thử (thử nghiệm với sh
cung cấp bởi dash
trong 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
cũng sẽ phát hiện một quy trình foobar
, nếu có. Tôi hiểu vấn đề này nằm ngoài phạm vi câu hỏi của bạn và chúng tôi có thể bỏ qua nó).
Trong ví dụ mygrep
này là tầm thường. Nó trả về trạng thái thoát của lệnh cuối cùng (và duy nhất). Trong khi xây dựng các hàm với logic phức tạp hơn, bạn có thể cần dựng sẵn đặc biệt return
để trả về trạng thái thoát mong muốn.
Cũng lưu ý đầu ra từ grep
không bị triệt tiêu. Không chỉ có chức năng vỏ có thể được sử dụng trong đường ống, đầu ra của nó cũng có thể được chuyển hướng. Thí dụ:
if ps | mygrep ps >/dev/null ; then
echo "process ps is running"
fi