Ich versuche, die folgenden Schnipsel aufzuräumen. Entwurfsziele sind die Protokollierung aller Ausgaben eines Skripts und sollten kein Wrapper sein. Weniger Zeilen sind besser.
Benutzereingaben interessieren mich nicht (zu diesem Zeitpunkt), Zielskripte werden nicht interaktiv ausgeführt.
Das Snippet muss
- Geben Sie stdout zum Protokollieren aus und geben Sie immer ein Echo an die Konsole zurück
- Geben Sie stderr zum Protokollieren und Echo zur Konsole aus, wenn das Debuggen aktiviert ist
- stderr-Nachrichten sollten Zeitstempel und andere nützliche Informationen vorangestellt werden
Im Moment habe ich folgendes, das nur unter neueren Versionen von bash (4.2+?) Wie in Ubuntu präzise getestet wird, sich aber unter CentOS6 schlecht verhält.
DEBUG_LOG="${0##*/}.log"
# copy stdout to log always and echo to console
exec > >(tee -a ${DEBUG_LOG})
# copy stderr to log only, unless debugging is enabled
[ $DEBUG_TEST = "true" ] \
&& exec 2> >(tee -a ${DEBUG_LOG} >&2) \
|| exec 2>> ${DEBUG_LOG}
Dann das...
# Expand escaped characters, wrap at 70 chars on spaces,
# and indent wrapped lines
msg_log() {
echo -e "$(date +%T) ${0##*/}: $1" \
| fold -w70 -s | sed '2~1s/^/ /' >&2;
}
msg_con() {
if [ "${DEBUG_TEST}" = "true" ]; then
msg_log "$1"
else
echo -e "$1" | fold -w70 -s | sed '2~1s/^/ /';
fi
}
Stattdessen echo
kann ich eine dieser msg-Prozeduren aufrufen, z msg_con "hello world"
.
Außerdem wird die Skriptausgabe dann an stderr gesendet, indem zum Zeitpunkt des Aufrufs eine Umgebungsvariable festgelegt wird, z DEBUG_TEST=true myscript
.
Ich habe gelesen, dass exec in einigen Shells wie Busybox möglicherweise nicht funktioniert. Unter https://stackoverflow.com/a/5200754 gibt es eine Kombination aus mkfifo und Gabel , die etwas Ähnliches bewirkt, aber ich würde Gabel lieber nicht verwenden, es sei denn, dies wird unbedingt benötigt.
Bevorzugen Sie bitte Bash-Beispiele, aber etwas, das unter sh funktioniert oder tragbarer ist, wäre schön. Irgendwelche Ideen?
quelle
exec > filename
sollte in sh funktionieren, und es funktioniert tatsächlich in Busybox v1.15.3 (Nov 2011). Die Prozessersetzung>(command)
ist jedoch nicht portierbar, da es sich um eine Bash-Erweiterung handelt. Vermeiden Sie es einfach, es in Skripten zu verwenden. Warum>>
reicht dir das nicht?Eine andere Lösung besteht darin, die Umleitung außerhalb Ihrer Skripte anzugeben. Wenn Ihr Skript im Hintergrund aufgerufen wird (per Cron oder Systemskript usw.), sollten sie so aufgerufen werden
Wenn Sie das Skript manuell aufrufen und die Ausgabe anzeigen möchten, rufen Sie es einfach ohne Umleitungen auf.
quelle
Diese beiden Beispiele erfüllen Ihre erklärten Ziele
oder
quelle
Sie könnten
tee
Befehl oderscript
Befehl verwenden, beide sind wirklich nützlich.quelle