Das Ausblenden der Ausgabe eines Shell-Befehls umfasst normalerweise das Umleiten von stderr und stdout. Gibt es eine eingebaute Funktion oder einen Befehl, der die Ausgabe standardmäßig verbirgt, aber bei einem Fehler die gesamte akkumulierte Ausgabe ausgibt? Ich möchte dies als Wrapper für Remote- ssh
Befehle ausführen. Jetzt verwenden sie die Umleitung, aber ich bekomme keine Ahnung, warum sie fehlgeschlagen sind, und sie sind einfach zu ausführlich.
BEARBEITEN: Am Ende habe ich die folgende Vorlage basierend auf der Antwort von @Belmin erstellt, die ich ein wenig optimiert habe, um alle vorherigen Befehle aus dem Skript zu akkumulieren, die aktuelle Prozesskennung zu verwenden, das Protokoll automatisch zu entfernen und einen roten Fehler hinzuzufügen Nachricht, wenn etwas schief geht. In dieser Vorlage sind die ersten silent
Wrapper erfolgreich, und der dritte Befehl schlägt fehl, da das Verzeichnis bereits vorhanden ist:
#!/bin/sh
set -e
SILENT_LOG=/tmp/silent_log_$$.txt
trap "/bin/rm -f $SILENT_LOG" EXIT
function report_and_exit {
cat "${SILENT_LOG}";
echo "\033[91mError running command.\033[39m"
exit 1;
}
function silent {
$* 2>>"${SILENT_LOG}" >> "${SILENT_LOG}" || report_and_exit;
}
silent mkdir -v pepe
silent mkdir -v pepe2
silent mkdir -v pepe
silent mkdir -v pepe2
2>&1
etwas verwenden:$* >>"${SILENT_LOG}" 2>&1" || report_and_exit
Antworten:
Ich würde eine Bash-Funktion wie folgt einrichten :
Dann können Sie einfach den Befehl ausführen:
quelle
/etc/passswd
oder eine andere wichtige Datei verweist und den Inhalt überschreibt.$* > /tmp/surpress.out 2>&1
Dies erfasst wirklich die stderr.$*
ist nicht das Beste, um willkürliche Eingaben zu verarbeiten. Besonders wenn es Leerzeichen oder Flags enthält. Am portabelsten ist es${1+"$@"}
laut stackoverflow.com/questions/743454/…Es sollte einfach genug sein, ein Skript für diesen Zweck zu schreiben.
So etwas wie dieses völlig ungetestete Skript.
Andererseits möchte ich bei Befehlen, die ich als Teil eines Skripts ausführe, normalerweise etwas Besseres, als einfach die gesamte Ausgabe zu drucken. Ich beschränke das, was ich sehe, oft auf das Unbekannte. Hier ist ein Skript, das ich von etwas adaptiert habe, das ich vor über einem Jahrzehnt gelesen habe.
quelle
Ich glaube nicht, dass es dafür eine saubere Methode gibt. Ich kann mir nur Folgendes vorstellen
Die Implementierung dieses Projekts könnte zwar ein interessantes Projekt sein, geht aber möglicherweise über Fragen und Antworten hinaus.
quelle
kurz mit so etwas wie
tehcommand &>/tmp/$$ || cat /tmp/$$
hängt davon ab, wie viel Benutzerfreundlichkeit / Typisierung Sie wollen / brauchen. (zB als Pipe verwenden oder den Befehl als Argument übergeben)
@zoredache short script ist im Grunde genommen ein Proto-Wrapper dafür, der mehr Robustheit bietet, die Parallelität handhabt usw
quelle
Versuchen Sie es so:
quelle
out="$(command args...)" || echo "$out"