Hai ống dẫn đến một lệnh


9

Tôi hơi bối rối bởi cú pháp sau đây. Mặc dù nó hoạt động, nó không hiểu tại sao nó hoạt động. Có vẻ như, có hai ống được gắn vào lệnh diff. Nhưng không phải chỉ có một STDINsao?

Ví dụ:

diff <(echo "foobar") <(echo "barbaz")
diff <(cat foo.txt) <(cat bar.txt)

Đây là một liên kết đến chủ đề có liên quan-- thay thế quá trình - trong bashtrang người đàn ông.
chepner

Câu trả lời:


13

Các đường ống được liên kết đơn giản với các mô tả tệp khác nhau hơn 0 (stdin):

$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62

Một quá trình tất nhiên có thể có nhiều hơn một mô tả tệp mở cùng một lúc, vì vậy không có vấn đề gì.


Nếu tôi chỉ biết nó được gọi là ống tạm thời, tôi đã có thể google nó. Cảm ơn bạn!

@iblue: Tôi không nghĩ nó được gọi là "ống tạm thời". Nó chỉ là đường ống, như được tạo ra bởi pipe()cuộc gọi hệ thống.
Sven Marnach

Nói chính xác, nó có thể được gọi là "ống có tên ẩn danh", nhưng nó đủ để google nó.

2
@WilliamPursell: Không có tệp nào liên quan. Shell tạo ra một đường ống ẩn danh bằng cách sử dụng pipe()và sau đó tạo ra các quy trình con. Quá trình chính không có thêm file descriptor mở nếu một ống nặc danh được sử dụng. Các mô tả tệp bổ sung này được thông qua trong biểu mẫu /dev/fd/...và quy trình thường sẽ chỉ đơn giản là mở chúng bằng các tên tệp này. Điều này sẽ dẫn đến việc chúng được chỉnh sửa dup(), tạo ra các mô tả tệp mở hơn nữa. Quá trình cũng có thể sử dụng bộ mô tả tệp được đặt tên ngay lập tức mà không cần bất kỳ cuộc gọi mở nào ...
Sven Marnach

1
... như thể hiện trong chương trình thử nghiệm nhỏ và ngu ngốc này . Sau khi biên dịch a, tôi gọi nó là ./a <(ls)và nó đã in thành công danh sách các tệp, chứng minh bộ giải mã tệp có tên (63 trong trường hợp của tôi) đã được mở. Bash có thể sử dụng các ống có tên trong một thư mục tạm thời trên các kiến ​​trúc khác với Linux, trong trường hợp đó, không có mô tả tệp bổ sung nào sẽ được mở khi vào quy trình chính.
Sven Marnach
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.