Cần lưu ý rằng quá trình thay thế không bị giới hạn ở biểu mẫu <(command)
, sử dụng đầu ra command
dưới dạng tệp. Nó có thể ở dạng >(command)
cung cấp một tệp như là đầu vào command
. Điều này cũng được đề cập trong trích dẫn của hướng dẫn bash trong câu trả lời của @ enzotib.
Đối với date | cat
ví dụ trên, một lệnh sử dụng thay thế quy trình của biểu mẫu >(command)
để đạt được hiệu quả tương tự sẽ là,
date > >(cat)
Lưu ý rằng >
trước đây >(cat)
là cần thiết. Điều này một lần nữa có thể được minh họa rõ ràng echo
như trong câu trả lời của @ Caleb.
$ echo >(cat)
/dev/fd/63
Vì vậy, nếu không có thêm >
, date >(cat)
sẽ giống như date /dev/fd/63
sẽ in một thông điệp tới thiết bị lỗi chuẩn.
Giả sử bạn có một chương trình chỉ lấy tên tệp làm tham số và không xử lý stdin
hoặc stdout
. Tôi sẽ sử dụng kịch bản đơn giản hóa psub.sh
để minh họa điều này. Nội dung của psub.sh
là
#!/bin/bash
[ -e "$1" -a -e "$2" ] && awk '{print $1}' "$1" > "$2"
Về cơ bản, nó kiểm tra cả hai đối số của nó là các tệp (không nhất thiết là các tệp thông thường) và nếu đây là trường hợp, hãy viết trường đầu tiên của mỗi dòng "$1"
để "$2"
sử dụng awk. Sau đó, một lệnh kết hợp tất cả những gì được đề cập cho đến nay là,
./psub.sh <(printf "a a\nc c\nb b") >(sort)
Cái này sẽ in
a
b
c
và tương đương với
printf "a a\nc c\nb b" | awk '{print $1}' | sort
nhưng những điều sau đây sẽ không hoạt động và chúng ta phải sử dụng quy trình thay thế ở đây,
printf "a a\nc c\nb b" | ./psub.sh | sort
hoặc hình thức tương đương của nó
printf "a a\nc c\nb b" | ./psub.sh /dev/stdin /dev/stdout | sort
Nếu ./psub.sh
cũng đọc stdin
bên cạnh những gì được đề cập ở trên, thì một dạng tương đương như vậy không tồn tại và trong trường hợp đó, chúng ta không thể sử dụng gì thay thế cho quá trình thay thế (tất nhiên bạn cũng có thể sử dụng tệp ống hoặc temp có tên, nhưng đó là một dạng khác câu chuyện).