2010-09-26 18 views
121

Giả sử tôi cũng có các chương trình ab mà tôi có thể chạy với ./a./b.Đầu ra chênh lệch từ hai chương trình không có tệp tạm thời

Có thể phân biệt kết quả đầu ra của chúng mà không cần ghi vào tệp tạm thời trước không?

+0

Liên quan: [Làm cách nào tôi có thể so sánh đầu ra của hai lệnh unix để tìm sự khác biệt?] (Http://stackoverflow.com/questions/4115545/how-can-i-compare-the-output-of-two -unix-commands-to-find-the-difference), [Làm cách nào để phân biệt đầu ra của hai lệnh?] (http://askubuntu.com/questions/229447/how-do-i-diff-the-output -of-hai-lệnh) – kenorb

Trả lời

171

Sử dụng <(command) để chuyển đầu ra của một lệnh tới chương trình khác như thể đó là tên tệp. Bash đưa đầu ra của chương trình ra một đường ống và chuyển tên tệp như /dev/fd/63 sang lệnh ngoài.

diff <(./a) <(./b) 

Tương tự, bạn có thể sử dụng >(command) nếu bạn muốn một cái gì đó ống vào một lệnh.

Điều này được gọi là "Thay thế quy trình" trong trang người dùng của Bash.

+1

Một hạn chế cần lưu ý là nếu. a hoặc ./b không thành công, người gọi sẽ không tìm thấy điều đó. –

+3

OP đã gắn thẻ câu hỏi bash, nhưng đối với bản ghi, điều này không hoạt động trong bất kỳ trình bao nào khác. Đó là một phần mở rộng bash cho tiêu chuẩn tiện ích Posix. – DigitalRoss

+3

Tôi đã thử giải pháp này với một chương trình Java và nhận được lỗi này: '-bash: lỗi cú pháp gần mã thông báo không mong muốn ('' .Tôi đã thử lại mà không có dấu ngoặc đơn và có '-bash: java: Không có tệp hoặc thư mục nào'. làm việc nếu lệnh có các tham số? – styfle

20

Một lựa chọn sẽ được sử dụng named pipes (FIFOs):

mkfifo a_fifo b_fifo 
./a > a_fifo & 
./b > b_fifo & 
diff a_fifo b_fifo 

... nhưng John Kugelman's solution là sạch hơn nhiều.

+7

Đây là di động hơn mặc dù, hoạt động ngay cả trên router của tôi :-) – unhammer

+0

Bạn nên loại bỏ các đường ống được đặt tên sau khi sử dụng chúng , với 'rm a_fifo b_fifo'. –

22

Thêm cho cả các câu trả lời, nếu bạn muốn xem một mặt bằng so sánh bên, sử dụng vimdiff:

vimdiff <(./a) <(./b) 

Something như thế này:

enter image description here

+0

'vimdiff' tạo ra các chế độ xem so sánh khác biệt đẹp, thông minh và tương tác. Nó dường như đi kèm với gói 'vim' trên hầu hết các hệ thống. –

6

Thêm nhiều hơn một chút để các những câu trả lời hay (đã giúp tôi!):

Lệnh docker xuất kết quả của nó giúp STD_ERR (tức là tập tin mô tả 2)

tôi muốn để xem nếu docker attachdocker attach --help cho cùng một sản lượng

$ docker attach

$ docker attach --help

Vừa gõ hai lệnh, tôi đã làm như sau:

$ diff <(!-2 2>&1) <(!! 2>&1)

!! cũng giống như -1 có nghĩa là chạy lệnh 1 trước khi một này - câu lệnh cuối cùng

-2 phương tiện chạy lệnh hai trước khi điều này một

2> & 1 có nghĩa là gửi file_descriptor 2 đầu ra (STD_ERR!) đến cùng một vị trí như đầu ra file_descriptor 1 (STD_OUT)

Hy vọng điều này đã được sử dụng một số.

8

Đối với bất cứ ai tò mò, đây là cách bạn thực hiện thay thế tiến trình trong việc sử dụng Fish shell:

Bash:

diff <(./a) <(./b) 

Cá:

diff (./a | psub) (./b | psub) 

Âm thanh như bạn có thể không đi cái khác ngay bây giờ.

+1

Cảm ơn! Đã tìm kiếm chính xác điều đó. – z3ntu

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