Làm cách nào để chuyển hướng stderr và stdout sang các tệp khác nhau và cũng hiển thị trong terminal?


30

Tôi muốn xem đầu ra của một lệnh trong thiết bị đầu cuối như thể không có chuyển hướng. Ngoài ra, stderr cần được chuyển hướng đến err.log và stdout cần được chuyển hướng đến stdout.log.

Sẽ rất tốt nếu có bản sao chính xác của nội dung được hiển thị trong thiết bị đầu cuối, tức là lỗi được in và khi nó xảy ra, trong một tệp riêng: stdouterr.log.


@Nuno Không, không phải vậy. OP muốn có các tệp khác nhau cho thiết bị xuất chuẩn và thiết bị xuất chuẩn.
dogbane

@dogbane Vâng, bạn nói đúng. Xin lỗi vì điều đó.
Nuno C. Inácio

Tôi vẫn thấy câu hỏi này rất quen thuộc. Hãy để tôi tìm kiếm ... Đây là một unix.stackexchange.com/q/4195/250 rất giống nhau và đây là một liên kết unix.stackexchange.com/q/1416/250
phunehehe

Câu trả lời:


37

Sử dụng teelệnh như sau:

(cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log

3>&1 1>&2 2>&3 là cách bạn trao đổi stderr và stdout, bởi vì tee chỉ có thể chấp nhận thiết bị xuất chuẩn.

Hãy xem lệnh tee Unix để chuyển hướng nâng cao hơn bằng cách sử dụng tee.


giải pháp tốt đẹp. Có cách nào để lấy mã thoát cmd không?
turbanoff

2
@turbanoff Thay thế cmdbằng (cmd ; echo >exit_code.txt $?).
Bắn Parthian

Tôi tin rằng điều này sẽ tốt hơn - giữ nguyên thứ tự của đầu ra cho dòng lệnh:((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log)
TTT

5

Tôi nghĩ rằng đăng nhập stdout và stderr vào hai tệp khác nhau là một ý tưởng tuyệt vời. Nó không làm cho các bản ghi không đồng bộ? Vì vậy, tôi đã thử như sau:

  • stdout thành "stdout.log" (như đề xuất của dogbane)
  • stderror thành "stderr.log" (như đề xuất của dogbane)
  • tất cả đầu ra cho "all.log" và
  • vẫn có thể thấy đầu ra trên màn hình (mặc dù trong một thiết bị đầu cuối riêng biệt!)

((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log) &> all.log

trong một nhà ga khác

tail -f --sleep-interval=2 all.log

Có phải là không thể trực tiếp stderr đến một tty thứ hai? Sau đó, không có logfile được yêu cầu.
Steven Lu

@StevenLu có, nếu bạn biết tên và có quyền viết vào tty thứ hai có thể được thực hiện.
Jasen

1
&| tee all.logthay vào đó sẽ dễ dàng hơn vào cuối lệnh thay vì&> all.log
Jasen

@Jasen: Lần thứ 2 tôi thấy &|. Tôi cũng hiểu &>, |&nhưng điều đó &|có nghĩa gì trong bối cảnh này? Tôi không thể tìm thấy một tài liệu tham khảo cú pháp phù hợp, không phải trên mạng, thậm chí không tham khảo trang hướng dẫn bash "bash (1)" ... Tx
Cbhihe 7/2/2016

1
@Cbhihe theo như tôi có thể nói nó không làm gì cả, tôi muốn nói|&
Jasen 7/2/2016

3

@dogbane, Cảm ơn.
Tôi cũng tìm thấy một cách khác để lưu cả hai luồng theo thứ tự vì chúng sẽ được in mà không cần chuyển hướng.

command 2> >(tee errlog | tee -a bothLog > /dev/tty ) | tee outlog | tee -a bothLog

Nhưng điều này chỉ hoạt động với các shell hỗ trợ quá trình thay thế.


-2

thử đi :

command 2>&1 | tee bothLog

4
Xin chào vasile, điều này không trả lời câu hỏi: balki cần các tệp riêng biệt cho thiết bị xuất chuẩn và thiết bị xuất chuẩn, giải pháp của bạn sẽ trộn cả hai trong cùng một luồng.
Mat

Tại sao mọi người hợp nhất stdout và stderr lại với nhau? Hay bảo người khác làm như vậy?
Nurettin
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.