Không thể ống vào diff?


74

Tôi muốn thông minh và so sánh một tệp từ xa với một tệp cục bộ mà không cần tải xuống thủ công trước. Tôi có thể lấy nội dung của tệp từ xa

ssh user@remote-host "cat path/file.name"

Tuy nhiên, đường ống dẫn đến diff

ssh user@remote-host "cat path/file.name" | diff path/file.name

đưa tôi cái này:

diff: missing operand after `path/file.nae'
diff: Try `diff --help' for more information.

Tôi đã thiết lập các khóa ssh, vì vậy nó không nhắc tôi nhập mật khẩu. Cách giải quyết cho việc này là gì?


5
Nhân tiện, bạn vẫn đang tải xuống tệp khi bạn thực hiện việc này (vì nội dung của nó được gửi qua kết nối SSH), bạn chỉ không lưu nó ở bất cứ đâu. Vì vậy, nó không giống như bạn tiết kiệm bất kỳ băng thông hoặc bất cứ điều gì.
David Z

2
Vâng, tôi chỉ không muốn làm hỏng hệ thống tệp của mình với các tệp một lần treo xung quanh.
dùng394

1
vì khi lệnh không hỗ trợ stdin (ví dụ thông qua -), bạn có thể sử dụng /dev/stdin. ví dụdiff file1 /dev/stdin
ctrl-alt-delor

Câu trả lời:


92

Cố gắng sử dụng -để đại diện cho đầu vào tiêu chuẩn.

ssh user@remote-host "cat path/file.name" | diff path/file.name -


khi so sánh các tệp khổng lồ (chẳng hạn như hình ảnh đĩa linux), điều này sẽ xuất tất cả chúng ra bàn điều khiển! ngay cả với diff -s (cho "giống") nó thực hiện điều này.
dùng391339

65

Đây là một cách giải quyết: diffdường như chấp nhận <( expr ) là đối số:

diff <(ssh \"cat path/file.name/") <(cat path/file.name)

17
Đó không phải là khác, đó là shell (bash, ksh và zsh hỗ trợ cú pháp này, nhưng nó không phải là POSIX), với một số trợ giúp từ kernel (nó phải cung cấp /dev/fd: diffnhìn thấy một cái gì đó giống như /dev/fd/3trên dòng lệnh của nó).
Gilles

3
Nó không "phải cung cấp" - vỏ cũng có thể tạo các đường ống được đặt tên tạm thời cho tính năng này.
ephemient

3
đây là câu trả lời tuyệt vời nhất
neves

6
Cá nhân tôi thích câu trả lời này. Tôi cần phải tìm hai tệp XML khác nhau; nhưng chúng cần được hình thành đúng cách trước. Điều đó dẫn đến điều này: diff -y <(xmllint --format "${1}") <(xmllint --format "${2}")mà bây giờ tôi sử dụng tất cả thời gian.
Paul Nelson Baker

Điều này cũng rất hữu ích trên OS X nơi người ta có thể muốn so sánh hai tệp nhị phân .plist:diff <(plutil -convert xml1 -o -- "${1}") <(plutil -convert xml1 -o - -- "${2}")
morgant 16/215

4

Đường ống vào diff tương đương với chạy

diff path/file.name

và sau đó, khi nó chạy, gõ toàn bộ nội dung của tệp.

Như bạn có thể thấy, đó không phải là những gì bạn mong đợi.


Không có cách giải quyết? :(
dùng394

1
Nhìn vào câu trả lời của Hemant. Tôi không biết về một.
Macha

1
diff /tmp/localtempfile <(ssh -A -o StrictHostKeyChecking=no root@server "cat /tmp/remotetempfile")

Điều gì với việc hạ thấp an ninh StrictHostKeyChecking=no? Nếu không thì một câu trả lời tốt.
ctrl-alt-delor 15/03/2017
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.