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_exit
Funktion 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 -e
fü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