Saya mencoba merapikan cuplikan berikut, tujuan desain adalah mencatat semua hasil dari skrip, dan tidak boleh menjadi pembungkus. Garis yang lebih sedikit lebih baik.
Saya tidak peduli dengan input pengguna (pada tahap ini), skrip target dijalankan secara non-interaktif.
Cuplikan perlu
- stdout output untuk login, dan selalu echo ke konsol
- output stderr untuk login, dan echo to console iff debugging diaktifkan
- pesan stderr harus diawali dengan prangko waktu dan kegunaan lainnya
Saat ini saya memiliki yang berikut ini yang hanya menguji di bawah versi terbaru dari bash (4.2+?) Seperti di Ubuntu yang tepat, tetapi melakukan kesalahan pada 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}
Lalu ini...
# 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
}
Alih-alih, echo
saya dapat memanggil salah satu prosedur pesan tersebut, misalnya msg_con "hello world"
,.
Output skrip kemudian akan pergi ke stderr dengan menetapkan sebagai variabel lingkungan pada waktu panggilan, misalnya DEBUG_TEST=true myscript
,.
Saya telah membaca bahwa exec mungkin tidak berfungsi di beberapa shell seperti busybox. Ada kombinasi mkfifo dan fork di https://stackoverflow.com/a/5200754 yang melakukan hal serupa tetapi saya lebih suka tidak menggunakan garpu kecuali benar-benar diperlukan.
Lebih suka contoh bash, tapi sesuatu yang bekerja di bawah sh atau lebih portabel akan menyenangkan. Ada ide?