2009-03-22 32 views
31

Điều này đã khiến tôi lo lắng một thời gian. Có thể chuyển hướng stdoutstderr cho cả đầu ra thiết bị đầu cuối vào chương trình không?Chuyển hướng bash stdout/stderr đến hai địa điểm?

Tôi hiểu rằng có thể chuyển hướng đầu ra đến tệp và đến stdout với tee, nhưng tôi muốn nó đi đến chương trình (trình soạn thảo [TextMate]) cũng như đầu ra của thiết bị đầu cuối… Tôi biết nó có thể với zsh…)

+0

xem thêm http://stackoverflow.com/a/60955/1295595 – craq

Trả lời

31

Bạn có thể sử dụng một ống tên, mà là để dành cho chính xác tình hình bạn mô tả.

mkfifo some_pipe 
command_that_writes_to_stdout | tee some_pipe \ 
    & command_that_reads_from_stdin < some_pipe 
rm some_pipe 

Hoặc, trong Bash:

command_that_writes_to_stdout | tee >(command_that_reads_from_stdin) 
+3

Thay thế tiến trình của Bash sẽ làm điều này cho bạn trong một bước (loại "đường ống ẩn danh") command_that_writes_to_stdout | tee> (command_that_reads_from_stdin) – oylenshpeegul

+0

@ephemient, cảm ơn! – JasonSmith

+1

Đó là chỉ stdout không stderr. – Nils

18

Có thể chuyển hướng stdout và stderr cho cả đầu ra đầu cuối và chương trình không?

Tôi không chắc chắn cách kết hợp stdout và stderr trên đầu vào cho trình chỉnh sửa là như thế nào, nhưng có phải cái gì đó giống như những gì bạn cần không?

input_prog 2>&1 | tee /dev/tty | my_editor 
+0

Charles, là "tee>/dev/tty" có đúng không? Tôi chưa bao giờ thấy nó được thực hiện theo cách đó. Tôi thường chỉ là "tee/dev/tty" để có được hiệu ứng bạn đang theo dõi. – paxdiablo

+0

@Pax @Charles Bailey sửa lỗi chính tả. Rollback nếu tee> được dự định – phihag

+0

Doh, vâng, xin lỗi. Rõ ràng stdout không thể được chuyển hướng và đường ống cùng một lúc. Cảm ơn. –

2

Tôi thực sự không biết liệu TextMate có thể lấy tệp để chỉnh sửa làm đầu vào chuẩn của nó hay không, điều đó có vẻ kỳ lạ một chút. Tôi nghi ngờ bạn sẽ muốn gửi stdout/stderr vào một tập tin và chỉnh sửa nó ở đó, trong trường hợp này bạn cần:

progname 2>&1 | tee tempfile ; textmate tempfile 

Các 2>&1 chuyển hướng stderr (tập tin xử lý 2) để đi đến cùng một vị trí như stdout (tập tin xử lý 1) để cả hai người trong số họ kết thúc trong một dòng duy nhất. Lệnh tee sau đó viết lệnh đó vào tempfile cũng như stdout.

Sau đó, khi quá trình kết thúc, trình chỉnh sửa được gọi lên trên tệp tạm thời.

Nếu nó có thể chấp nhận đầu vào tiêu chuẩn để chỉnh sửa, sử dụng:

progname 2>&1 | tee /dev/tty | textmate 
+0

Pipe và nó sẽ mở ra trong một tài liệu mới – obeattie

Các vấn đề liên quan