2010-09-26 10 views
121

Angenommen, ich habe auch Programme a und b, die ich mit ./a und ./b ausführen kann.Diff-Ausgabe von zwei Programmen ohne temporäre Dateien

Ist es möglich, ihre Ausgaben zu unterscheiden, ohne zuerst in temporäre Dateien zu schreiben?

+0

Verwandte: [Wie kann ich die Ausgabe von zwei Unix-Befehle vergleichen, um den Unterschied zu finden?] (Http://stackoverflow.com/questions/4115545/how-can-i-compare-the-output-of-zwei -unix-commands-to-find-the-difference), [Wie verteile ich die Ausgabe von zwei Befehlen?] (http://askubuntu.com/questions/229447/how-do-i-diff-the-output -of-two-commands) – kenorb

Antwort

171

Verwenden Sie <(command), um die Ausgabe eines Befehls an ein anderes Programm zu übergeben, als wäre es ein Dateiname. Bash leitet die Ausgabe des Programms an eine Pipe weiter und übergibt einen Dateinamen wie /dev/fd/63 an den äußeren Befehl.

diff <(./a) <(./b) 

Ebenso können Sie >(command) verwenden, wenn Sie in ein Befehl zum Rohr etwas wollen.

Dies wird "Process Substitution" in Bash Man-Seite genannt.

+1

Ein Nachteil, der zu beachten ist, ist, dass, wenn ./a oder ./b fehlschlägt, der Anrufer das nicht herausfinden wird. –

+3

Das OP hat die Frage bash markiert, aber für den Datensatz funktioniert das in keiner anderen Shell. Es ist eine Bash-Erweiterung des Posix-Utility-Standards. – DigitalRoss

+3

Ich habe versucht, diese Lösung mit einem Java-Programm und habe diesen Fehler: '-bash: Syntaxfehler in der Nähe von unerwarteten Token (''. Ich versuchte es erneut ohne Klammern und bekam '-bash: java: keine solche Datei oder Verzeichnis.Es nicht funktionieren, wenn der Befehl Parameter hat? – styfle

20

Eine Option wäre named pipes (FIFOs) zu verwenden:

mkfifo a_fifo b_fifo 
./a > a_fifo & 
./b > b_fifo & 
diff a_fifo b_fifo 

... aber John Kugelman's solution ist viel sauberer.

+7

Das ist tragbarer, funktioniert aber auch auf meinem Router :-) – unhammer

+0

Sie sollten die Named Pipes nach der Verwendung entfernen , mit 'rm a_fifo b_fifo'. –

22

die Antworten auf beide Hinzufügen, wenn Sie eine Seite an Seite Vergleich sehen möchten, verwenden Sie vimdiff:

vimdiff <(./a) <(./b) 

Etwas wie folgt aus:

enter image description here

+0

'vimdiff' erstellt schöne, intelligente und interaktive Vergleichsansichten. Es scheint mit dem 'vim' Paket auf den meisten Systemen zu kommen. –

6

ein wenig mehr das Hinzufügen schon gute Antworten (hat mir geholfen!):

Der Befehl docker gibt seine Hilfe anaus(d.h. Dateideskriptor 2)

ich die gleiche Ausgabe

$ docker attach

$ docker attach --help

Nachdem gerade diese beiden Befehle eingegeben haben, habe ich die folgenden, wenn docker attach und docker attach --help gab sehen wollte:

$ diff <(!-2 2>&1) <(!! 2>&1)

!! ist die gleiche wie -1, die den Befehl 1 vor diesem Lauf bedeutet - der letzte Befehl

-2 Mittel, um den Befehl zwei vor diesem

2> & 1 bedeutet senden file_descriptor 2 Ausgang laufen (STD_ERR!) an die gleiche Stelle wie file_descriptor 1 output (STD_OUT)

Ich hoffe, das hat etwas genutzt.

8

Für alle neugierig, das ist, wie Sie Prozess-Substitution bei der Verwendung der Fish shell ausführen:

Bash:

diff <(./a) <(./b) 

Fische:

diff (./a | psub) (./b | psub) 

Klingt wie Sie können geh jetzt nicht zum anderen.

+1

Danke! War genau danach gesucht. – z3ntu

Verwandte Themen