Đó là phụ thuộc vỏ và không được ghi lại AFAICS. Trong ksh
và bash
, trong trường hợp đầu tiên, foo
sẽ chia sẻ cùng một stdin như bar
. Họ sẽ chiến đấu cho đầu ra của echo
.
Vì vậy, ví dụ trong,
$ seq 10000 | paste - <(tr 1 X)'
1 X
2 X042
3 X043
4 X044
5 X045
[...]
Bạn thấy bằng chứng paste
đọc mọi khối văn bản khác từ seq
đầu ra trong khi tr
đọc các khối khác.
Với zsh
, nó nhận được stdin bên ngoài (trừ khi nó là một thiết bị đầu cuối và vỏ không tương tác trong trường hợp nó được chuyển hướng từ /dev/null
). ksh
(nơi nó bắt nguồn) zsh
và bash
là những chiếc vỏ giống như Bourne duy nhất có hỗ trợ thay thế quy trình AFAIK.
Trong echo "bla" | bar < <(foo)
, lưu ý rằng bar
stdin sẽ là đường ống được cung cấp bởi đầu ra của foo
. Đó là hành vi được xác định rõ. Trong trường hợp đó, có vẻ như foo
stdin là đường ống được cung cấp bởi echo
tất cả ksh
, zsh
và bash
.
Nếu bạn muốn có một hành vi nhất quán trên cả ba vỏ và là bằng chứng trong tương lai vì hành vi có thể thay đổi vì nó không được ghi lại, tôi sẽ viết nó:
echo bla | { bar <(foo); }
Để chắc chắn rằng foo
stdin cũng là đường ống từ echo
(Tôi không thể hiểu tại sao bạn muốn làm điều đó). Hoặc là:
echo bla | bar <(foo < /dev/null)
Để đảm bảo foo
không không đọc từ các đường ống từ echo
. Hoặc là:
{ echo bla | bar 3<&- <(foo <&3); } 3<&0
Để có foo
stdin của stdin bên ngoài như trong các phiên bản hiện tại của zsh
.