Làm thế nào tôi có thể ống chỉ stderr trong zsh?


18

Trong bash:

$ echo hi 2>&1 1>/dev/null | cat
$

Trong khi ở zsh:

$ echo hi 2>&1 1>/dev/null | cat
hi
$

Có cách nào để chỉ lỗi tiêu chuẩn trong khi chuyển hướng ra ngoài tiêu chuẩn?

Câu trả lời:


22

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 &).


3
Cảm ơn! Một cách khác để có được xung quanh nó là (echo hi 2>&1 1>/dev/null) | cat.
Tavian Barnes

1
@TavianBarnes, điểm tốt, cảm ơn. Tôi đã thêm nó vào câu trả lời cho đầy đủ. Nó cũng hoạt động với một nhóm chỉ huy ( {echo...}|cat)
Stéphane Chazelas
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.