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?