TL; DR: (bash và zsh)
$ cmd 2> >(stderr-filter >&2)
Thí dụ:
% cat /non-existant 2> >(tr o X >&2)
cat: /nXn-existant: NX such file Xr directXry
%
Nhiều câu trả lời trên mạng StackExchange có dạng:
cat /non-existant 3>&1 1>&2 2>&3 3>&- | sed 's/e/E/g'
Điều này có một giả định tích hợp: bộ mô tả tệp 3 không được sử dụng cho việc khác.
Thay vào đó, hãy sử dụng bộ mô tả tệp được đặt tên và {ba,z}sh
sẽ cấp phát bộ mô tả tệp có sẵn tiếp theo> = 10:
cat /non-existant {tmp}>&1 1>&2 2>&$tmp {tmp}>&- | sed 's/e/E/g'
Lưu ý rằng bộ mô tả tệp được đặt tên không được hỗ trợ bởi POSIX sh
.
Vấn đề khác ở trên là lệnh không thể được chuyển sang các lệnh khác mà không hoán đổi lại STDOUT và STDERR trở lại giá trị ban đầu của chúng.
Để cho phép đường ống chuyển tiếp trong POSIX sh
, (và vẫn giả sử FD 3 không được sử dụng), nó sẽ phức tạp :
(cmd 2>&1 >&3 3>&- | stderr-filter >&2 3>&-) 3>&1
Vì vậy, với giả định và cú pháp gnarly của điều này, bạn có thể tốt hơn nên sử dụng cú pháp bash
/ đơn giản hơn zsh
được hiển thị trong TL; DR ở trên và được giải thích ở đây .