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?
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?
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.
Ein Nachteil, der zu beachten ist, ist, dass, wenn ./a oder ./b fehlschlägt, der Anrufer das nicht herausfinden wird. –
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
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
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.
Das ist tragbarer, funktioniert aber auch auf meinem Router :-) – unhammer
Sie sollten die Named Pipes nach der Verwendung entfernen , mit 'rm a_fifo b_fifo'. –
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:
'vimdiff' erstellt schöne, intelligente und interaktive Vergleichsansichten. Es scheint mit dem 'vim' Paket auf den meisten Systemen zu kommen. –
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.
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.
Danke! War genau danach gesucht. – z3ntu
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