Ich möchte die Ausgabe eines Skripts vereinfachen, indem ich die Ausgabe von sekundären Befehlen unterdrücke, die normalerweise erfolgreich sind.
Doch mit -q
versteckt auf sie den Ausgang , wenn sie gelegentlich fehlschlagen, so dass ich keine Möglichkeit , das Verständnis der Fehler haben. Darüber hinaus melden diese Befehle ihre Ausgabe an stderr
.
Gibt es eine Möglichkeit, die Ausgabe eines Befehls nur dann zu unterdrücken, wenn dies erfolgreich ist ?
Zum Beispiel (aber nicht beschränkt auf) so etwas:
mycommand | fingerscrossed
Wenn alles gut geht, wird fingerscrossed
die Ausgabe abgefangen und verworfen. Andernfalls wird es an die Standard- oder Fehlerausgabe weitergegeben (was auch immer).
quelle
moreutils
.Das sollte wahrscheinlich den Trick machen. Es puffert die Ausgabe von jedem
command
in eine gelöschte temporäre Datei und siphoniert danach seine Ausgabe in entweder/dev/null
oder stderr, abhängig davon, ob sein Rückgabestatus nicht Null war oder nicht. Da die temporäre Datei vor der Zeit gelöscht wird, kann sie nicht von einem Prozess gelesen werden , aber die aktuell Shell und seine Kinder auf seiner Dateideskriptor (abgesehen von hinterhältigen/proc/$pid/fd
Snoops mit dem entsprechenden Berechtigungen) , und es erfordert keine Reinigung , wenn Sie fertig sind.Vielleicht eine bequemere Lösung für Linux-Systeme:
... , die in den meisten Schalen, ähnlich wie die andere arbeitet, mit der Ausnahme , dass Sie es wie nennen kann:
divert some simple-command with args
. Hüten Sie sich vor hohen Ausgabebefehlen in"$@"
, wenn auch fürdash
,yash
oder einige andere Schalen , die mit Rohren hier-Dokumente zu tun - ich denke , es ist in diesen Schalen möglich sein kann , den Rohrpuffer zu füllen (bei einer Standard von rund 128kb auf Linuxen) und so Deadlock . Das ist nicht eine Sorge für sein sollteksh
,mksh
,bash
,zsh
, oder die Bourne - Shell, obwohl - all jene tun im Grunde das Gleiche wie ich ausdrücklich oben mitexec
.quelle
Normalerweise gibt der Befehl im Fehlerfall Meldungen an aus,
stderr
sodass Sie die Aufgabe einfach unterdrücken könnenstdout
quelle
stderr
(so hat es keine Auswirkung).Um Ihre eigenen chronischen zu machen
quelle
Ich mache so etwas in meinen Makefiles:
Wenn Sie das an Ihre Situation anpassen, können Sie Folgendes tun:
Also führt "if" den Befehl aus und leitet die Ausgabe an mycommand.log weiter. Wenn Sie stdout vs stdout vs whatever abfangen müssen, müssen Sie möglicherweise den Pipe-Befehl '&>' in '>' ändern. Wenn der Befehl fehlschlägt, erfassen Sie den Fehlercode, drucken Sie den Inhalt von mycommand.log aus, entfernen Sie mycommand.log und kehren Sie schließlich mit dem ursprünglichen Fehlercode zurück.
Ohne das (exit $ c) würden Sie mit dem Exit-Code zurückkehren, der mit dem übereinstimmt, was der Befehl 'rm' zurückgegeben hat.
Schließlich, wenn Sie einen Einzeiler wollen, würde so etwas funktionieren.
quelle
(...)
so etwas? Weil es nichts Nützliches für dich tut, als zusätzliche Sub-Shells zu erzeugen.(exit $c)
stellt ein$?
, was Sie sonst nicht tun können.if ! (mycommand) &>x
ist bei der Umleitung sinnvoll, wenn der Befehl zB verwendettime
oder einen Shell-Fehler geben würde.{ ; }
die Locken ... obwohlexit
es ein wenig schwierig ist, zugegeben.$?
beenden, können Sie es einfach verwenden,exit $c
aber ja, in anderen Fällen(exit $?)
hat es Wert (obwohl eine Shell-Funktionrret() { return $1; }
im Allgemeinen besser wäre, würde ich argumentieren). Die Subshell für Befehle ist allerdings immer noch nicht wirklich, wie mikeserv anzeigte.Ich fand gerade diese viel einfachere Antwort auf diese andere Frage :
Klappt wunderbar!
quelle