次のスニペットを整理しようとしています。設計目標は、スクリプトからのすべての出力をログに記録することであり、ラッパーであってはなりません。線が少ないほど良いです。
(この段階では)ユーザー入力は気にしません。ターゲットスクリプトは非対話的に実行されます。
スニペットは
- ログにstdoutを出力し、常にコンソールにエコーする
- ログにstderrを出力し、デバッグが有効な場合はコンソールにエコー
- stderrメッセージには、タイムスタンプとその他の有用性をプレフィックスとして付ける必要があります
現時点では、Ubuntuのように最近のバージョンのbash(4.2以降?)でのみテストできますが、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}
次にこれ...
# 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
}
代わりにecho
、これらのmsgプロシージャの1つを呼び出すことができますmsg_con "hello world"
。
また、スクリプトの出力は、呼び出し時に環境変数として設定することにより、stderrに送られます DEBUG_TEST=true myscript
。
私は、execがbusyboxなどの一部のシェルで機能しない可能性があることを読みました。https://stackoverflow.com/a/5200754に mkfifoとforkの組み合わせがあります。これは同様のことを行いますが、絶対に必要な場合を除いて、forkは使用しません。
bashの例をお勧めしますが、shの下で動作するか、より移植性の高いものが良いでしょう。何か案は?