Es ist bekannt, wie die Standardausgabe eines Prozesses in die Standardeingabe eines anderen Prozesses geleitet wird:
proc1 | proc2
Was aber, wenn ich den Standardfehler von proc1 an proc2 senden und die Standardausgabe an ihrem aktuellen Speicherort belassen möchte? Sie würden denken, bash
hätte einen Befehl in der Art von:
proc1 2| proc2
Aber leider nein. Gibt es eine Möglichkeit, dies zu tun?
rc
anderen Shell durchführen. ZB :proc1 |[2] proc2
. Ist es nicht schön Aber nichtbash
drin.Antworten:
Es gibt auch eine Prozessersetzung . Dadurch wird ein Prozess durch eine Datei ersetzt.
Sie können
stderr
wie folgt an eine Datei senden :Sie können die Datei jedoch wie folgt durch einen Prozess ersetzen:
Hier ist ein konkretes Beispiel, das
stderr
sowohl an den Bildschirm gesendet als auch an eine Protokolldatei angehängt wirdquelle
weston --help 2> >(less)
), und es hat meine Muschel gebrochen, ich musste gehen und mich wieder einloggen.weston --help
undless
eine Tastaturinteraktion erwarten, aber nur einer von ihnen diese empfängt, befinden Sie sich möglicherweise in einer unangenehmen Situation. Versuchen Siegrep
stattdessen, mit so etwas zu testen . Außerdem stellen Sie möglicherweise fest, dass beide Maus- / Tastatureingaben ohnehin zum 2. Befehl und nicht zu Weston gehen.Sie können den folgenden Trick verwenden, um
stdout
und zu tauschenstderr
. Dann verwenden Sie einfach die reguläre Pipe-Funktionalität.Vorausgesetzt ,
stdout
undstderr
beide an der gleichen Stelle am Anfang darauf, dies wird dir geben , was Sie brauchen.Das
x>y
Bit ändert das Dateihandle,x
sodass es seine Informationen jetzt an die Stelle sendet, auf die das Dateihandley
derzeit zeigt. Für unseren speziellen Fall:3>&1
Erstellt ein neues Handle,3
das in das aktuelle Handle1
(ursprüngliches Standardout) ausgegeben wird , um es irgendwo für den letzten Aufzählungspunkt unten zu speichern.1>&2
Ändert das Handle1
(stdout), um es an das aktuelle Handle2
(original stderr) auszugeben .2>&3-
Ändert das Handle2
(stderr), um es an das aktuelle Handle3
(ursprüngliches stdout) auszugeben, und schließt dann das Handle3
(über das-
am Ende).Es ist effektiv der Swap-Befehl, den Sie in Sortieralgorithmen sehen:
quelle
1>&2-
hier und nicht nur1>&2
? Ich verstehe nicht, warum wir fd schließen wollen2
, wenn wir es nur sofort wieder öffnen / neu zuweisen.Bash 4 hat diese Funktion:
zsh hat auch diese Funktion.
- -
Bei anderen / älteren Shells geben Sie dies einfach explizit als ein
Erster Befehl 2> & 1 | OtherCommand
quelle
OtherCommand
schreibt die kombinierten Daten irgendwo, möglicherweise woanders. Es sind also nicht die gleichen Daten, und sie gehen möglicherweise woanders hin. Das ist ungefähr das Gegenteil des Wunsches des OP, nicht wahr?proc1
Ausgaben an stdout und an stderr ausgegeben werden und Sie möchten, dass stderr zum stdin von gehtproc2
(wo sich das stdout von proc1 befindet), dann erreicht meine Antwort dies. Ich gab dem OP, worum er bat , vielleicht nicht, was er wollte . Darin liegt die potentielle Mehrdeutigkeit. Die OP akzeptiert die Antwort , die Swaps stdout und stderr das ist nicht , was er verlangte.Tauschen ist großartig, da es das Problem löst. Nur für den Fall, dass Sie nicht einmal das Original-Standard benötigen, können Sie dies folgendermaßen tun:
Die Reihenfolge ist wichtig; du würdest nicht wollen:
Da dies alles umleiten wird
/dev/null
!quelle
Keines davon hat wirklich sehr gut funktioniert. Der beste Weg, das zu tun, was Sie wollten, ist:
Dies funktioniert nur in Fällen, in denen
command
keine Tastatureingabe erforderlich ist. z.B:würde gzip Fehler in weniger setzen
quelle