Đường ống cả stdout và stderr trong bash?


156

Dường như các phiên bản mới hơn của bash có &>toán tử, (nếu tôi hiểu chính xác), chuyển hướng cả thiết bị xuất chuẩn và thiết bị xuất chuẩn vào một tệp ( &>>thay vào đó là tệp được thêm vào, như Adrian đã làm rõ).

Cách đơn giản nhất để đạt được điều tương tự, nhưng thay vào đó chuyển sang một lệnh khác?

Ví dụ: trong dòng này:

cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError

Tôi muốn grep khớp với nội dung cả trong thiết bị xuất chuẩn và thiết bị xuất chuẩn (hiệu quả là kết hợp chúng thành một luồng).

Lưu ý : câu hỏi này là hỏi về đường ống, không phải chuyển hướng - vì vậy nó không phải là một bản sao của câu hỏi hiện đang được đánh dấu là trùng lặp.


Xem câu trả lời thứ hai ( stackoverflow.com/a/637834/1129642 ) về câu hỏi được liên kết để biết cách chính xác để chuyển cả stdout và stderr. Không cần câu hỏi khác.
Marki555

4
@triplee Không phải là một bản sao chính xác, phải không? Ống so với chuyển hướng đến tập tin?
Benjamin W.

@BenjaminW Có ít nhất một câu trả lời trong đó giải quyết cả hai tình huống, mặc dù đó không phải là câu trả lời được chấp nhận. Đây là một câu hỏi khá phổ biến vì vậy chúng tôi có thể tìm thấy một bản sao tốt hơn hoặc yêu cầu người điều hành hợp nhất những điều này - hoặc thậm chí, trong trường hợp xấu nhất, tạo ra một kinh điển hoàn toàn mới cho chủ đề này. Nếu bạn tìm thấy một bản dupe tốt hơn, bằng mọi cách hãy đề xuất nó. Cảm ơn trước.
tripleee

12
@tripleee Giải quyết, vâng, nhưng không có câu trả lời nào sử dụng |&phím tắt, mà theo tôi là giải pháp thuận tiện nhất để "chuyển hướng cả thiết bị xuất chuẩn và thiết bị xuất chuẩn sang đường ống".
Benjamin W.

3
Đây không phải là một bản sao của câu hỏi được liên kết và không rõ câu trả lời của Marko đã làm những gì tôi muốn. Ngoài ra, nó không đề cập đến | &. Bỏ phiếu để mở lại.
Martin Bonner hỗ trợ Monica

Câu trả lời:


163

(Lưu ý rằng việc &>>file thêm vào một tệp trong khi &>sẽ chuyển hướng và ghi đè lên tệp hiện có trước đó.)

Để kết hợp stdoutstderrbạn sẽ chuyển hướng cái sau sang cái trước bằng cách sử dụng 2>&1. Điều này chuyển hướng stderr (mô tả tệp 2) sang thiết bị xuất chuẩn (mô tả tệp 1), ví dụ:

$ { echo "stdout"; echo "stderr" 1>&2; } | grep -v std
stderr
$

stdoutđi đến stdout, stderrđi đến stderr. grepChỉ nhìn thấy stdout, do đó stderrin ra thiết bị đầu cuối.

Mặt khác:

$ { echo "stdout"; echo "stderr" 1>&2; } 2>&1 | grep -v std
$

Sau khi viết cho cả stdout và stderr, 2>&1chuyển hướng stderr trở lại stdout và grepthấy cả hai chuỗi trên stdin, do đó lọc cả hai.

Bạn có thể đọc thêm về chuyển hướng ở đây .

Về ví dụ của bạn (POSIX):

cmd-doesnt-respect-difference-between-stdout-and-stderr 2>&1 | grep -i SomeError

hoặc, sử dụng >=bash-4:

cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError

Cảm ơn đã làm rõ trên &>>. Tôi đã sửa câu hỏi của mình.
Andrew Ferrier

18
Tôi đã thêm ví dụ của bạn vào câu trả lời của tôi, chỉ trong trường hợp không rõ ràng dựa trên các ví dụ đã cho của tôi. Là một lưu ý phụ, bạn cũng có thể sử dụng bash-cụ thể |&thay vì 2>&1 |.
Adrian Frühwirth

13
Lưu ý bên lề về lối tắt |&được đề xuất bởi @ AdrianFrühwirth cho độc giả tương lai: tính năng này chỉ được hỗ trợ với bashphiên bản 4+. Nếu bạn đang sử dụng 3 hoặc thấp hơn, bạn phải gắn bó 2>&1 |.
tomocafe

3
Bash chuyển hướng được giải thích rất tốt ở đây . @ AdrianFrühwirth đã hoàn thành tốt công việc, liên kết được dán còn đi xa hơn nữa. Đôi khi, tôi muốn tài liệu Bash chính thức là tốt.
David Andreoletti 13/03/2015

112

Bash có một tốc ký 2>&1 |, cụ thể là |&, ống dẫn cả stdout và stderr (xem hướng dẫn ):

cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError

Điều này đã được giới thiệu trong Bash 4.0, xem ghi chú phát hành .


Cảm ơn đã thêm điều này cho đầy đủ. Tôi sẽ giữ câu trả lời khác chính xác vì nhiều người vẫn đang sử dụng bash pre-4.0. Nhưng điều này rất hữu ích.
Andrew Ferrier

9
Đáng chú ý nhất có lẽ, Bash mà tàu trên macOS đã quá cũ để hỗ trợ điều này.
Flimm

@Flimm nhưng zsh thì không
Trenton

1
Vì ksh sử dụng | & cho coproc, đây có vẻ là một lựa chọn tồi cho một tốc ký không cần thiết. Tôi ghét phải xem các dòng với một đống dups và chuyển hướng nhiều như anh chàng tiếp theo, nhưng có điều gì đó để nói là rõ ràng .... và tôi xin lỗi rằng nhận xét này không thêm nhiều. Tôi chỉ muốn bày tỏ sự chán ghét đối với tốc ký mà không bỏ qua một câu trả lời thực sự hữu ích, bởi vì thật tốt khi mọi người nhìn thấy điều này. Tôi không biết điều này, vì vậy cảm ơn vì đã cho tôi biết.
Paul Hodges

@PaulHodges Tôi đồng ý rằng nó không khả dụng - Tôi chủ yếu thích sử dụng nó cho các phiên Bash tương tác để tránh gõ quá nhiều.
Benjamin W.
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.