Nie możesz potokować do diff?


74

Chciałem być sprytny i porównać plik zdalny z plikiem lokalnym bez wcześniejszego ręcznego pobrania. Mogę pobrać zawartość pliku zdalnego przez

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

Jednak przesyłanie tego do diff

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

daje mi to:

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

Mam skonfigurowane klucze ssh, więc nie monituje mnie o hasło. Co to za obejście?


5
Nawiasem mówiąc, nadal pobierasz plik, gdy to robisz (ponieważ jego zawartość jest wysyłana przez połączenie SSH), po prostu nie zapisujesz go nigdzie. Więc to nie tak, że oszczędzasz przepustowość lub coś takiego.
David Z

2
Tak, po prostu nie chcę zepsuć mojego systemu plików za pomocą plików jednorazowych.
user394,

1
bo gdy polecenie nie obsługuje standardowego wejścia (np. via -), możesz użyć /dev/stdin. np.diff file1 /dev/stdin
ctrl-alt-delor

Odpowiedzi:


92

Spróbuj użyć -do przedstawienia standardowego wejścia.

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


przy porównywaniu gigantycznych plików (takich jak obrazy dysków linuksowych) jest to wysyłanie ich wszystkich do konsoli! nawet z diff -s (dla „same”) robi to.
user391339

65

Oto jedno obejście: diffwydaje się akceptować <( wyrażenie ) jako argumenty:

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

17
To nie jest różnica, to jest powłoka (bash, ksh i zsh obsługują tę składnię, ale to nie jest POSIX), z pewną pomocą jądra (musi dostarczyć /dev/fd: diffwidzi coś takiego /dev/fd/3w wierszu poleceń).
Gilles,

3
Nie „musi zapewniać” - powłoki mogą również tworzyć tymczasowe nazwane potoki dla tej funkcji.
efhemient

3
to najfajniejsza odpowiedź!
neves

6
Ja osobiście wolę tę odpowiedź. Musiałem różnicować dwa różne pliki XML; ale najpierw musiały zostać odpowiednio uformowane. Doprowadziło to do tego: diff -y <(xmllint --format "${1}") <(xmllint --format "${2}")którego teraz używam cały czas.
Paul Nelson Baker

Jest to również bardzo przydatne w systemie OS X, w którym można porównać dwa binarne pliki .plist:diff <(plutil -convert xml1 -o -- "${1}") <(plutil -convert xml1 -o - -- "${2}")
morgant

4

Pipowanie do diff jest równoważne z uruchomieniem

diff path/file.name

a następnie po uruchomieniu wpisuje całą zawartość pliku.

Jak widać, nie tego się spodziewałeś.


Brak obejścia? :(
user394,

1
Spójrz na odpowiedź Hemanta. Nie wiedziałem o jednym.
Macha,

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

Co jest z obniżeniem bezpieczeństwa StrictHostKeyChecking=no? W przeciwnym razie dobra odpowiedź.
ctrl-alt-delor
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.