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