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.xzthay "$1"cho khả năng đọc và xz -cdthay cat ... | xz -dvì 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 3và 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<&0Và ( 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), cmd3và cmd1trong cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0sẽ 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ó .