Leiten Sie das Echo in der Trap-Funktion zurück zur Standardausgabe um.

Leiten Sie das Echo in der Trap-Funktion zurück zur Standardausgabe um.

Ich habe derzeit ein Problem damit, Echo-Anweisungen in meiner Trap-Funktion auf stdout auszugeben. Ich leite die gesamte Ausgabe (Fehler und stdout) von einem von mir ausgeführten Befehl in eine Protokolldatei um. Wenn jedoch ein Fehler auftritt, möchte ich, dass der Fehler nicht in die Protokolldatei, sondern zurück auf stdout umgeleitet wird.

Ich dachte daran, einfach so etwas zu machen wie trap 1> on_exit EXIT. Aber ich habe keine Ahnung davon. Wie soll ich das machen?

Bearbeiten: Zur Klarstellung: Ich leite absichtlich ALLE Ausgaben (stderr und stdout) in eine Protokolldatei um. Wenn an IRGENDEINEM Punkt ein Fehler auftritt, wird die Ausgabe dieses Fehlers dieses Befehls in das Protokoll geschrieben (was ich will), UND ich möchte, dass die on_exitFunktion in der Benutzeransicht (stdout) ausgegeben wird, statt in der Protokolldatei. Mein Skript hat derzeit diese Trap-Funktion, die in die Protokolldatei ausgibt. Ich möchte nur, dass es an stdout gesendet wird.

#!/usr/bin/env bash
set -e

on_exit()
{
  echo "An error occurred"
}

function main()
{
  trap on_exit EXIT
  # for looping over set of commands
  $command &> "$LOGFILE"
}

main "$@"

Antwort1

[das ist eher ein Kommentar als eine Antwort; es ist nicht wirklich klar, was Sie erreichen wollen]

Dies set -eführt dazu, dass Ihr Skript bei einem Fehler beendet wird und es somit zu spät ist, noch etwas umzuleiten.

Vielleicht suchen Sie so etwas:

#! /bin/bash
set -o errtrace # let functions inherit the ERR trap
exec 3>&2       # save the original stderr into fd 3

on_error() {
        echo >&2 "An error occurred"    # still printed to the log the 1st time
        exec 2>&3       # switch back to the original stderr
        trap '' ERR     # disable ourselves
}
main() {
        trap on_error ERR
        no_such_command # this fail with an error
        no_such_command # again
        no_such_command # and again
}

main "$@" >/tmp/log 2>&1

beim Ausführen:

$ bash /tmp/err
/tmp/err: line 13: no_such_command: command not found
/tmp/err: line 14: no_such_command: command not found
$ cat /tmp/log
/tmp/err: line 12: no_such_command: command not found
An error occurred

Das Skript des OP wurde geändert, um eine Meldung an das ursprüngliche Standardfehlerprotokoll auszugeben und bei einem Fehler beendet zu werden:

#!/usr/bin/env bash
set -o errtrace # let functions inherit the ERR trap
exec 3>&2       # save the original stderr

on_error()
{
  echo >&3 "An error occurred"
  exit 1
}

function main()
{
  trap on_error ERR
  # for looping over set of commands
  $command &> "$LOGFILE"
}

main "$@"

beim Ausführen:

$ command=no_such_command LOGFILE=/tmp/log bash /tmp/jeg
An error occurred
$ cat /tmp/log
/tmp/jeg: line 15: no_such_command: command not found

verwandte Informationen