Wyobraziłem sobie, że najprostszym sposobem na porównanie zawartości dwóch podobnych katalogów byłoby coś takiego
diff `ls old` `ls new`
Ale rozumiem, dlaczego to nie działa; diff
otrzymuje w wierszu poleceń dużą długą listę plików, a nie dwa strumienie, jak się spodziewałem. Jak przekazać dwa wyjścia, aby bezpośrednio się różnić?
command-line
diff
Potrójny
źródło
źródło
Odpowiedzi:
Podstawienie polecenia zastępuje
`…`
dane wyjściowe polecenia w wierszu polecenia, dlategodiff
listę plików w obu katalogach traktuje jako argumenty. To, czego chcesz, todiff
zobaczyć dwie nazwy plików w wierszu poleceń i mieć zawartość tych plików w postaci list katalogów. Tak właśnie działa proces zastępowania .Argumenty, które
diff
będą wyglądać/dev/fd/3
i/dev/fd/4
: są deskryptorami plików odpowiadającymi dwóm potokom utworzonym przez bash. Podiff
otwarciu tych plików zostanie on podłączony do strony odczytu każdej potoku. Strona zapisu każdej potoku jest połączona zls
poleceniem.źródło
echo <(echo) <(echo)
nigdy nie myślałem, że to może być tak interesujące: Dls
polega na tym, że zmienia nazwy plików. Analiza wyników jest krucha (nie działa z „dziwnymi” nazwami plików). Porównywanie dwóch list katalogów jest w porządku, o ile dane wyjściowe są jednoznaczne. W przypadku dowolnych nazw plików wymagałoby to opcji takiej jak--quoting-style=escape
.<(…)
utworzy potok. Wygląda na to, że meld nie działa z rurami, więc nie możesz go użyć<(…)
. W zsh możesz zamienić<(…)
na=(…)
i to zadziała, ponieważ=(…)
umieszcza wyniki pośrednie w pliku tymczasowym. W bash nie wydaje mi się, żeby istniała jakaś wygodna składnia, sam musiałbyś zarządzać plikami tymczasowymi.W przypadku zsh użycie
=(command)
automatycznie tworzy plik tymczasowy i zastępuje=(command)
ścieżką samego pliku. Z Zastępowanie polecenia$(command)
jest zastępowane wyjściem polecenia.Istnieją więc trzy opcje:
$(...)
<(...)
=(...)
Subskrypcja procesu o smaku zsh # 3 jest bardzo przydatna i może być używana do porównywania wyników dwóch poleceń za pomocą narzędzia różnicowego, na przykład Beyond Compare:
W przypadku Beyond Compare zwróć uwagę, że musisz użyć
bcomp
powyższego (zamiastbcompare
), ponieważbcomp
uruchamia porównanie i czeka na jego zakończenie. Jeśli używaszbcompare
, uruchamia to porównanie i natychmiast kończy pracę, dzięki czemu tymczasowe pliki utworzone w celu przechowywania danych wyjściowych poleceń znikają.Przeczytaj więcej tutaj: http://zsh.sourceforge.net/Intro/intro_7.html
Zauważ też:
oraz następujące, co stanowi różnicę między dwoma typami podstawienia procesu obsługiwanego przez zsh (tj. # 2 i # 3):
Odniesienie: https://unix.stackexchange.com/questions/393349/difference-between-subshells-and-process-substitution
źródło
$(...)
nie jest podstawieniem procesu, jest podstawieniem polecenia .<(...)
jest podstawieniem procesu. Dlatego cytowany fragment w ogóle nie wspomina$(...)
.Skorupa Rybna
W skorupce ryby musisz potokować do psub . Oto przykład porównania konfiguracji heroku i dokku z Beyond Compare :
źródło
meld
do porównywania jest oprogramowanie open source i dostępne w repozytoriach Ubuntu i EPEL. meldmerge.orgCzęsto używam techniki opisanej w zaakceptowanej odpowiedzi:
ale zwykle używam go z dużo bardziej złożonymi poleceniami niż w powyższym przykładzie. W takich przypadkach ułożenie komendy diff może być denerwujące. Wymyśliłem kilka rozwiązań, które inni mogą uznać za przydatne.
Uważam, że w 99% przypadków wypróbowuję odpowiednie polecenia przed uruchomieniem mechanizmu różnicowego. W związku z tym polecenia, które chcę udostępnić, są właśnie w mojej historii ... dlaczego ich nie użyć?
Korzystam z wbudowanego bash Fix Command (fc) do wykonania dwóch ostatnich poleceń:
Flagi FC to:
-1
-1
odnoszą się do rozpoczęcia i zakończenia positing w historii, w tym przypadku ITS od ostatniego polecenia do ostatniego polecenia co daje tylko ostatnie polecenie.Na koniec zamykamy to,
$()
aby wykonać polecenie w podpowłoce.Oczywiście jest to trochę kłopotliwe w pisaniu, abyśmy mogli stworzyć alias:
Lub możemy stworzyć funkcję:
który obsługuje określenie linii historii do użycia. Po użyciu obu znajduję alias, który preferuję.
źródło