Câu hỏi trong thông báo tiền thưởng hiện tại:
ví dụ chung là quá phức tạp. Ai đó có thể vui lòng giải thích làm thế nào để thực hiện ví dụ sau đây?diff <(cat "$2" | xz -d) <(cat "$1" | xz -d)
dường như có một câu trả lời ở đây .
Như được hiển thị trong câu trả lời của Gilles , ý tưởng chung là gửi đầu ra của lệnh "nhà sản xuất" đến các tệp thiết bị mới 1 ở các giai đoạn khác nhau của đường ống, làm cho chúng có sẵn cho các lệnh "người tiêu dùng", có thể lấy tên tệp làm đối số ( giả sử rằng hệ thống của bạn cung cấp cho bạn quyền truy cập vào mô tả tệp như /dev/fd/X
).
Cách đơn giản nhất để đạt được những gì bạn đang tìm kiếm có lẽ là:
xz -cd file1.xz | { xz -cd file2.xz | diff /dev/fd/3 -; } 3<&0
(Sử dụng file1.xz
thay "$1"
cho khả năng đọc và xz -cd
thay cat ... | xz -d
vì vì một lệnh là đủ).
Đầu ra của lệnh "nhà sản xuất" đầu tiên xz -cd file1.xz
, được dẫn đến một lệnh ghép ( {...}
); nhưng, thay vì được sử dụng ngay lập tức như là đầu vào tiêu chuẩn của lệnh tiếp theo, nó được sao chép thành mô tả tệp 3
và do đó có thể truy cập được mọi thứ bên trong lệnh ghép như /dev/fd/3
. Đầu ra của lệnh "nhà sản xuất" thứ hai xz -cd file2.xz
, không tiêu thụ đầu vào tiêu chuẩn cũng như bất cứ thứ gì từ bộ mô tả tệp 3
, sau đó được dẫn đến lệnh "người tiêu dùng" diff
, đọc từ đầu vào tiêu chuẩn và từ /dev/fd/3
.
Sao chép mô tả đường ống và tệp có thể được thêm vào để cung cấp tệp thiết bị cho nhiều lệnh "nhà sản xuất" khi cần, ví dụ:
xz -cd file1.xz | { xz -cd file2.xz | { diff /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
Mặc dù có thể không liên quan trong bối cảnh câu hỏi cụ thể của bạn, nhưng đáng chú ý là:
cmd1 <(cmd2) <(cmd3)
, cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
Và ( cmd2 | ( cmd3 | ( cmd1 /dev/fd/3 /dev/fd/4 ) 4<&0 ) 3<&0 )
có tác dụng tiềm năng khác nhau trên môi trường thực thi ban đầu.
Trái với những gì xảy ra trong cmd1 <(cmd2) <(cmd3)
, cmd3
và cmd1
trong cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
sẽ không thể đọc bất kỳ đầu vào từ người dùng. Điều đó sẽ yêu cầu mô tả tập tin thêm. Ví dụ, để phù hợp
diff <(echo foo) <(read var; echo "$var")
bạn sẽ cần một cái gì đó như
{ echo foo | { read var 0<&9; echo "$var" | diff /dev/fd/3 -; } 3<&0; } 9<&0
1 Nhiều hơn về chúng có thể được tìm thấy trên U & L, ví dụ như trong Hiểu / dev và các thư mục con và tệp của nó .