Câu trả lời:
Với zsh và với mult_iostùy chọn bật (theo mặc định), trong:
echo hi 2>&1 1>/dev/null | cat
Điều 1> /dev/null | catnày được xem như là một sự chuyển hướng nhiều lần của echothiết bị xuất chuẩn.
Vì vậy, echothiết bị xuất chuẩn hiện được chuyển hướng đến cả hai /dev/nullvà một đường ống đến cat(như thể đang sử dụng tee).
Để hủy nhiều chuyển hướng đó, bạn có thể làm:
echo hi 2>&1 >&- > /dev/null | cat
Đó là, đóng stdout (hủy đường ống) trước khi chuyển hướng đến /dev/null
Hoặc sử dụng một nhóm lệnh hoặc subshell như:
{echo hi 2>&1 1>/dev/null} | cat
(echo hi 2>&1 1>/dev/null) | cat
Theo cách đó, echothiết bị xuất chuẩn chỉ được chuyển hướng rõ ràng một lần (chuyển hướng đường ống được áp dụng cho nhóm / lớp con và được kế thừa bởi echo).
Hoặc bạn có thể vô hiệu hóa multioshoàn toàn:
(setopt nomultios; echo hi 2>&1 > /dev/null | cat)
Ngoài ra, bạn có thể sử dụng thay thế quá trình thay vì đường ống:
echo hi 2> >(cat) > /dev/null
Tuy nhiên, hãy cẩn thận khi tắt điều khiển công việc (như trong tập lệnh), catquy trình sẽ được chạy không đồng bộ (như thể bắt đầu với &).
{echo...}|cat)
(echo hi 2>&1 1>/dev/null) | cat.