GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Die Ausgabe eines Shell-Befehls nur bei Erfolg ausblenden?

Lösung 1:

Es sollte einfach genug sein, ein Skript für diesen Zweck zu schreiben.

So etwas wie dieses völlig ungetestete Skript.

OUTPUT=`tempfile`
program_we_want_to_capture &2>1 > $OUTPUT
[ $? -ne 0 ]; then
    cat $OUTPUT
    exit 1
fi
rm $OUTPUT

Auf der anderen Seite möchte ich für Befehle, 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 übernommen habe, das ich vor über einem Jahrzehnt gelesen habe.

#!/bin/bash

the_command 2>&1 | awk '
BEGIN \
{
  # Initialize our error-detection flag.
  ErrorDetected = 0
}
# Following are regex that will simply skip all lines
# which are good and we never want to see
/ Added UserList source/ || \
/ Added User/ || \
/ init domainlist / || \
/ init iplist / || \
/ init urllist / || \
/ loading dbfile / || \
/^$/ {next} # Uninteresting message.  Skip it.

# Following are lines that we good and we always want to see
/ INFO: ready for requests / \
{
  print "  " $0 # Expected message we want to see.
  next
}

# any remaining lines are unexpected, and probably error messages.  These will be printed out and highlighted.
{
  print "->" $0 # Unexpected message.  Print it
  ErrorDetected=1
}

END \
{
  if (ErrorDetected == 1) {
    print "Unexpected messages (\"->\") detected in execution."
    exit 2
  }
}
'
exit $?

Lösung 2:

Ich glaube nicht, dass es dafür einen sauberen Weg gibt, das einzige, was mir einfällt, ist

  • Erfassen Sie die Ausgabe des Befehls.
  • Überprüfen Sie den Rückgabewert des Befehls und ob er fehlgeschlagen ist
    • Anzeige der erfassten Ausgabe.

Die Implementierung könnte zwar ein interessantes Projekt sein, aber vielleicht jenseits von Q&A.

Lösung 3:

Ich würde eine Bash-Funktion wie folgt einrichten:

function suppress { /bin/rm --force /tmp/suppress.out 2> /dev/null; ${1+"[email protected]"} > /tmp/suppress.out 2>&1 || cat /tmp/suppress.out; /bin/rm /tmp/suppress.out; }

Dann könnten Sie einfach den Befehl ausführen:

suppress foo -a bar

Lösung 4:

Versuchen Sie Folgendes:

out=`command args...` || echo $out

Linux
  1. Verstecken Sie die versteckten Linux-Dateien in Windows

  2. Wie hängt man die Ausgabe an eine Datei an?

  3. Ruft die erste Zeile der Ausgabe eines Shell-Befehls ab

  4. Wie führe ich den Vim-Befehl von der Shell aus?

  5. Befehlsausgabe im Docker umleiten

Befehlszeilenaliase in der Linux-Shell

So leiten Sie die Shell-Befehlsausgabe um

Wie weist man die Ausgabe eines Befehls einer Shell-Variablen zu?

Die Ausgabe eines Befehls in `time Command` umleiten?

Text auf der Terminalausgabe suchen?

Warum gibt slabtop -o nur die ersten 23 Zeilen zurück, wenn der Befehl weitergeleitet wird?