Anscheinend kenne ich nicht alle verfügbaren Ausgabeziele. Ich weiß über stdout
( &1
) und stderr
( &2
) Bescheid . Nachdem ich jedoch beide Deskriptoren umgeleitet habe, erhalte ich manchmal immer noch eine Ausgabe in meiner Konsole!
Das einfachste Beispiel, an das ich denken kann, ist GNU Parallel. Jedes Mal, wenn ich es benutze, sehe ich einen Zitierhinweis. Selbst wenn ich das tue &2>1 > file
, sehe ich immer noch den Hinweis.
Und das gilt auch für emerge
: Wenn ich emerge laufen lasse und es Probleme gibt, werden einige Informationen weder gedruckt stdout
noch weitergeleitet stdin
, da ich sie umleite und sie immer noch durchkommen.
Ich löse diese Probleme meistens mit script
, frage mich aber immer noch, was das Problem verursacht.
bash
terminal
io-redirection
MatthewRock
quelle
quelle
/dev/tty
.parallel
:mkdir ~/.parallel; touch ~/.parallel/will-cite
Deaktiviert die nervige Nachricht. Alternativ können Sie sich nach anderen Implementierungen von umsehenparallel
.parallel
als Beispiel.Antworten:
Die von Ihnen verwendete Syntax ist falsch.
wird aufgeteilt als
Dieser Wille:
cmd
als Hintergrundjob ohne Umleitungenstderr
zu einer Datei umgeleitet , die buchstäblich aufgerufen wird,1
undstdout
zufile
Die gewünschte Syntax lautet:
Die Reihenfolge der Operationen ist wichtig. Dieser Wille:
stdout
anfile
stderr
an&1
- dh dasselbe Dateihandle wiestdout
Das Ergebnis ist, dass beide
stderr
undstdout
weitergeleitet werdenfile
.In
bash
, eine einfacheren Nicht-Standard (und so ich werde es nicht empfehlen, auf Portabilität Gründen) Syntaxcmd &> file
macht das Gleiche.quelle
/dev/tty
, aber hoffentlich passiert dies nicht zu oft (wenn überhaupt).at
Befehl auf Ihrem Computer haben und über die Berechtigung verfügen, ihn zu verwenden, können Sie den Befehl über ausführenat now
. Einzelheiten finden Sie auf der Manpage. Dadurch wird der Befehl über einen Batch-Prozessmechanismus ausgeführt, und der Prozess hat niemals ein tty, in das geschrieben werden kann. Aber im Allgemeinen würde ich mir keine Sorgen um diesen Randfall machen. Normalerweise werden nur Prozesse verwendet, die eine Interaktion erfordern und die den Benutzern trotz Umleitung absichtlich angezeigt werden müssen/dev/tty
.Es gibt zwei Probleme.
Der erste ist, dass die Reihenfolge wichtig ist, der zweite ist
/dev/tty
.Verwenden wir dieses Skript als Beispielskript, von dem wir die Ausgabe erfassen möchten:
test.sh
:Nun sehen wir uns die Ausgaben der Befehle an:
./testmyscript.sh 2>&1 >/dev/null
:Da die Auswertungsreihenfolge von links nach rechts ist, erhalten wir zuerst "Weiterleiten
stderr
an den Ortstdout
, an dem ausgegeben wird (also Konsolenausgabe)". Dann werden wir "umgeleitetstdout
zu"/dev/null
. Am Ende ergibt sich folgende Situation:stdout
->/dev/null
stderr
-> KonsoleAlso machen wir es richtig:
./testmyscript.sh >/dev/null 2>&1
Und wir bekommen:
ttdada
.Jetzt führen wir "Weiterleiten
stdout
an/dev/null
" und dann "Weiterleiten stderr an wo stdout zeigt" (so,/dev/null
) aus. Hurra!Wir haben jedoch immer noch ein Problem. Programm druckt auf
/dev/tty
. Jetzt weiß ich nicht, wie ich diese Art von Verhalten korrigieren soll, also wirst du es höchstwahrscheinlich brauchenscript
, aber hoffentlich kommt dieses Verhalten nicht allzu oft vor.quelle