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?
sumber
exec > filename
harus bekerja di sh, dan itu benar-benar berfungsi di busybox v1.15.3 (Nov 2011). Tetapi proses substitusi tidak>(command)
dapat dilakukan karena ekstensi bash. Hindari menggunakannya dalam skrip. Kenapa>>
tidak cukup untukmu?Solusi lain adalah dengan menentukan pengalihan di luar skrip Anda. Ketika skrip Anda dipanggil di latar belakang (dengan cron, atau skrip sistem, dll.), Mereka harus dipanggil seperti ini
Saat Anda menjalankan skrip secara manual dan Anda ingin melihat hasilnya, panggil saja tanpa pengalihan.
sumber
Dua contoh ini akan melakukan apa yang menjadi tujuan Anda
atau
sumber
Anda bisa menggunakan
tee
perintah atauscript
perintah keduanya benar-benar bermanfaat.sumber