Jak odróżnić wyjście dwóch poleceń?

131

Wyobrażałem sobie, że najprostszym sposobem porównania zawartości dwóch podobnych katalogów byłoby coś w rodzaju

diff 'ls old' 'ls new'

Ale widzę, dlaczego to nie działa; diff jest w posiadaniu dużej, długiej listy plików w wierszu poleceń, zamiast dwóch strumieni, jak miałem nadzieję. W jaki sposób przekazać dwa wyjścia do bezpośredniego różnicowania?

    
zadawane Ternary 15.12.2012, 23:01
źródło

3 odpowiedzi

192

Podstawienie polecenia '…' zastępuje dane wyjściowe polecenia w wierszu poleceń, więc diff widzi listę plików w obu katalogach jako argumenty. To czego potrzebujesz, to diff , aby zobaczyć dwie nazwy plików w wierszu poleceń, a ich zawartość powinna być katalogiem. To właśnie robi zastępowanie procesu .

diff <(ls old) <(ls new)

Argumenty do diff będą wyglądały jak /dev/fd/3 i /dev/fd/4 : są deskryptorami plików odpowiadającymi dwóm potokom utworzonym przez bash. Gdy diff otworzy te pliki, zostanie podłączony do strony odczytu każdej z potoków. Strona zapisu każdej rury jest połączona z komendą ls .

    
odpowiedział Gilles 15.12.2012, 23:06
źródło
2

Powłoka ryby

W powłoce Fish musisz potokować w psub . Oto przykład porównania konfiguracji heroku i dokku z Beyond Compare :

bcompare (ssh me@myapp.pl dokku config myapp | sort | psub) (heroku config -a myapp | sort | psub)
    
odpowiedział WooYek 12.04.2018, 09:34
źródło
1

Dla zsh, użycie =(command) automatycznie tworzy plik tymczasowy i zastępuje =(command) ścieżką samego pliku. Przy podstawieniu polecenia $(command) jest zastępowany przez wyjście polecenia.

Dostępne są trzy opcje:

  1. Podstawianie komend: $(...)
  2. Zastąpienie procesu: <(...)
  3. Substytut procesowy zsh-smaku: =(...)
Podsycjonowanie procesu aromatyzacji

​​zsh, # 3, jest bardzo użyteczne i można go używać w taki sposób, aby porównać wyjście dwóch poleceń za pomocą narzędzia różnicowego, na przykład Beyond Compare:

bcomp  =(ulimit -Sa | sort) =(ulimit -Ha | sort)

Dla Beyond Compare, musisz użyć bcomp dla powyższego (zamiast bcompare ), ponieważ bcomp uruchamia porównanie, a czeka , aby zakończyć. Jeśli użyjesz bcompare , to uruchomi porównanie i natychmiast wyjdzie, dzięki czemu znikną pliki tymczasowe stworzone do przechowywania danych wyjściowych poleceń.

Przeczytaj więcej tutaj: link

Zwróć też uwagę:

  

Zwróć uwagę, że powłoka tworzy tymczasowy plik i usuwa go po zakończeniu polecenia.

i następujące, które są różnicą między dwoma typami podstawiania procesów obsługiwanymi przez zsh (tj. nr 2 i nr 3):

  

Jeśli czytasz stronę man zsh, możesz zauważyć, że & lt; (...) jest inną formą podstawienia procesu podobną do = (...). Jest między nimi istotna różnica. W przypadku & lt; (...) powłoka tworzy nazwaną potok (FIFO) zamiast pliku. Jest to lepsze, ponieważ nie wypełnia systemu plików; ale to nie działa we wszystkich przypadkach. W rzeczywistości, jeśli zastąpiliśmy = (...) przez & lt; (...) w powyższych przykładach, wszystkie przestałyby działać, z wyjątkiem fgrep -f & lt; (...). Nie możesz edytować rury ani otwierać jej jako folderu pocztowego; fgrep nie ma jednak problemu z odczytaniem listy słów z potoku. Możesz się zastanawiać, dlaczego diff & lt; (foo) bar nie działa, ponieważ foo | diff - bar działa; dzieje się tak, ponieważ diff tworzy plik tymczasowy, jeśli zauważy, że jeden z jego argumentów jest -, a następnie kopiuje jego standardowe wejście do pliku tymczasowego.

Odsyłacz: link

    
odpowiedział Ashutosh Jindal 29.06.2018, 10:59
źródło

Przeczytaj inne pytania na temat tagów