Wie verteile ich die Ausgabe von zwei Befehlen?

131

Ich hatte mir vorgestellt, dass der einfachste Weg, den Inhalt zweier ähnlicher Verzeichnisse zu vergleichen, etwas wie

wäre
diff 'ls old' 'ls new'

Aber ich verstehe, warum das nicht funktioniert; diff erhält eine große lange Liste von Dateien in der Befehlszeile statt zwei Streams, wie ich es mir erhofft hatte. Wie übertrage ich die beiden Ausgänge direkt an diff?

    
Ternary 15.12.2012, 23:01
quelle

3 Antworten

192

Befehlsersetzung '…' ersetzt die Ausgabe des Befehls in der Befehlszeile, sodass diff die Liste der Dateien in beiden Verzeichnissen als Argumente sieht. Was Sie wollen, ist für diff , zwei Dateinamen in der Befehlszeile zu sehen, und der Inhalt dieser Dateien muss die Verzeichnisliste sein. Das macht Prozesssubstitution .

diff <(ls old) <(ls new)

Die Argumente für diff sehen folgendermaßen aus: /dev/fd/3 und /dev/fd/4 : Sie sind Dateideskriptoren, die zwei von bash erstellten Pipes entsprechen. Wenn diff diese Dateien öffnet, wird es mit der Leseseite jeder Pipe verbunden. Die Schreibseite jeder Pipe ist mit dem Befehl ls verbunden.

    
Gilles 15.12.2012, 23:06
quelle
2

Fischschale

In Fish Shell musst du in psub pinnen. Hier ist ein Beispiel für den Vergleich von Heroku und Dokku mit Beyond Compare :

bcompare (ssh me@myapp.pl dokku config myapp | sort | psub) (heroku config -a myapp | sort | psub)
    
WooYek 12.04.2018 09:34
quelle
1

Bei zsh wird mit =(command) automatisch eine temporäre Datei erstellt und =(command) durch den Pfad der Datei selbst ersetzt. Bei der Befehlsersetzung wird $(command) durch die Ausgabe des Befehls ersetzt.

Also gibt es drei Möglichkeiten:

  1. Befehlsersetzung: $(...)
  2. Prozesssubstitution: <(...)
  3. zsh-Aromatisierte Prozesssubstitution: =(...)

Die zsh-artige Prozesssubstitution # 3 ist sehr nützlich und kann so verwendet werden, um die Ausgabe von zwei Befehlen mit einem Diff-Tool zu vergleichen, zum Beispiel Beyond Compare:

bcomp  =(ulimit -Sa | sort) =(ulimit -Ha | sort)
Beachten Sie, dass Sie für den obigen Vergleich bcomp (anstelle von bcompare ) verwenden müssen, da bcomp den Vergleich startet und wartet , damit der Vorgang abgeschlossen wird. Wenn Sie bcompare verwenden, wird der Vergleich gestartet und sofort beendet, aufgrund dessen die temporären Dateien, die zum Speichern der Ausgabe der Befehle erstellt wurden, nicht mehr vorhanden sind.

Lesen Sie hier mehr: Pfandrecht

Bemerke das auch:

  

Beachten Sie, dass die Shell eine temporäre Datei erstellt und sie löscht, wenn der Befehl beendet ist.

und das Folgende, was der Unterschied zwischen den zwei Typen von Prozesssubstitution ist, die von zsh unterstützt werden (d. h. # 2 und # 3):

  

Wenn Sie die man-Seite von zsh lesen, stellen Sie vielleicht fest, dass & lt; (...) eine andere Form der Prozesssubstitution ist, die ähnlich ist wie = (...). Es gibt einen wichtigen Unterschied zwischen den beiden. Im Fall & lt; (...) erzeugt die Shell eine benannte Pipe (FIFO) anstelle einer Datei. Dies ist besser, da es das Dateisystem nicht füllt; aber es funktioniert nicht in allen Fällen. In der Tat, wenn wir = (...) durch & lt; (...) in den obigen Beispielen ersetzt hätten, hätten alle von ihnen mit Ausnahme von fgrep -f & lt; (...) aufgehört zu arbeiten. Sie können eine Pipe nicht bearbeiten oder sie als E-Mail-Ordner öffnen. fgrep hat jedoch kein Problem damit, eine Liste von Wörtern aus einer Pipe zu lesen. Sie können sich fragen, warum diff & lt; (foo) bar nicht funktioniert, da foo | diff - bar funktioniert; Das liegt daran, dass diff eine temporäre Datei erstellt, wenn sie feststellt, dass eines ihrer Argumente - ist, und dann ihre Standardeingabe in die temporäre Datei kopiert.

Referenz: Pfandrecht

    
Ashutosh Jindal 29.06.2018 10:59
quelle

Tags und Links