Sto cercando di riordinare i seguenti frammenti, gli obiettivi di progettazione sono di registrare tutto l'output di uno script e non dovrebbe essere un wrapper. Meno linee sono migliori.
Non mi interessa l'input dell'utente (in questa fase), gli script target vengono eseguiti in modo non interattivo.
Lo snippet deve
- output stdout per il log ed eco sempre alla console
- emette stderr per il log ed echo per console se il debug è abilitato
- i messaggi stderr devono essere preceduti da timestamp e altra utilità
Al momento ho il seguente che prova solo nelle versioni recenti di bash (4.2+?) Come in Ubuntu preciso, ma si comporta male su CentOS6.
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}
Poi questo...
# 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
}
Invece di echo
posso chiamare una di quelle procedure di msg, ad es msg_con "hello world"
.
Anche l'output dello script andrà quindi su stderr impostando come variabile di ambiente al momento della chiamata, ad es DEBUG_TEST=true myscript
.
Ho letto che exec potrebbe non funzionare in alcune shell come busybox. C'è una combinazione mkfifo e fork su https://stackoverflow.com/a/5200754 che fa qualcosa di simile ma preferirei non usare fork se non assolutamente necessario.
Preferisci esempi bash per favore, ma qualcosa che funziona sotto sh o è più portatile sarebbe bello. Qualche idea?