Tidak dapat menyalurkan ke diff?


74

Saya ingin menjadi pintar dan membandingkan file jarak jauh dengan file lokal tanpa terlebih dahulu mengunduhnya secara manual. Saya bisa mendapatkan isi dari file jarak jauh dengan

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

Namun, perpipaan itu untuk diff

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

berikan saya ini:

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

Saya memiliki kunci ssh yang diatur, jadi itu tidak meminta saya untuk kata sandi. Apa solusinya untuk ini?


5
Omong-omong, Anda masih mengunduh file ketika Anda melakukan ini (karena kontennya dikirim melalui koneksi SSH), Anda tidak menyimpannya di mana pun. Jadi bukan berarti Anda menghemat bandwidth atau apa pun.
David Z

2
Ya, saya hanya tidak ingin membersihkan sistem file saya dengan file satu-shot berkeliaran.
user394

1
karena ketika perintah tidak mendukung stdin (misalnya via -), Anda dapat menggunakan /dev/stdin. misalnyadiff file1 /dev/stdin
ctrl-alt-delor

Jawaban:


92

Coba gunakan -untuk mewakili input standar.

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


ketika membandingkan file raksasa (seperti gambar disk linux) ini mengeluarkan semuanya ke konsol! bahkan dengan diff -s (untuk "sama") ia melakukan ini.
user391339

65

Berikut ini satu solusinya: difftampaknya menerima <( expr ) sebagai argumen:

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

17
Itu bukan diff, itu shell (bash, ksh dan zsh mendukung sintaks ini, tetapi ini bukan POSIX), dengan bantuan dari kernel (ia harus menyediakan /dev/fd: diffmelihat sesuatu seperti /dev/fd/3pada baris perintahnya).
Gilles

3
Itu tidak "harus menyediakan" - kerang dapat membuat pipa bernama sementara untuk fitur ini juga.
ephemient

3
ini jawaban yang paling keren!
neves

6
Saya pribadi lebih suka jawaban ini. Saya perlu membedakan dua file XML yang berbeda; tetapi mereka perlu dibentuk dengan benar terlebih dahulu. Itu mengarah pada ini: diff -y <(xmllint --format "${1}") <(xmllint --format "${2}")yang sekarang saya gunakan sepanjang waktu.
Paul Nelson Baker

Ini juga sangat berguna pada OS X di mana orang mungkin ingin membandingkan dua file diff <(plutil -convert xml1 -o -- "${1}") <(plutil -convert xml1 -o - -- "${2}")
.plist

4

Perpipaan ke dalam diff sama dengan menjalankan

diff path/file.name

dan kemudian, setelah itu berjalan, ketikkan seluruh isi file.

Seperti yang Anda lihat, bukan itu yang Anda harapkan.


Tidak ada solusi? :(
user394

1
Lihatlah jawaban Hemant. Saya tidak tahu satu pun.
Macha

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

Ada apa dengan penurunan keamanan StrictHostKeyChecking=no? Kalau tidak, jawaban yang bagus.
ctrl-alt-delor
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.