BASH 4:ティーをログファイルに、/ dev / nullにフェールオーバー

BASH 4:ティーをログファイルに、/ dev / nullにフェールオーバー

そのアクションを記録しようとするスクリプトがあります。これらすべてを行うことができるTシャツがあります。現在、$ LOG_FILEに書き込めない場合、スクリプトは終了します。代わりにログファイルに書き込まないようにします。

スクリプトで記録された部分は次のとおりです。

for foo in "${array_of_foos[@]"; do
  {get bar from foo} | sort -u
done | xargs -n 100 -P 20 bar_processor.sh |& tee "$LOG_FILE"

ユーザーがログファイルに書き込みをしたくないときに設定できるものはありますか?LOG_FILE=/dev/nullそれともそれを処理するより良い方法はありますか?このスクリプトはrootとして実行されず、決して実行されません。

ベストアンサー1

書き込み可能なログファイルまたはまだ存在していませんが、書き込み可能なディレクトリにあるログファイルを処理するには、次のことを試すことが最も信頼できる方法です。

LOG_FILE=loggit.log
( printf "" >>"$LOG_FILE" ) 2>/dev/null || LOG_FILE=/dev/null

# ...
echo "Stuff to be logged" >>"$LOG_FILE"
some | pipeline >>"$LOG_FILE"

場合によっては、出力をコピーしたいと思います。標準出力ログファイルに保存すると、次のことができます。

some | pipeline | tee -a "$LOG_FILE"

意味のあるログファイルがあるかどうかに応じて他のタスクを実行したい場合は、より複雑なシナリオを使用してそれを処理できます。LOG_FILE=上記のコードスニペットで設定(つまり何も設定しない)してから、テストの背後にあるコードで次のことができます。

[[ -n "$LOG_FILE" ]] && echo "Stuff to be logged" >>"$LOG_FILE"

可能であれば、次の構文を使用してロギング中に無条件コードを実行できます。

some | pipeline >>"${LOG_FILE:-/dev/null}"
some | pipeline | tee -a "${LOG_FILE:-/dev/null}"

他の質問に対する私の答えもご覧ください。ファイルにテキストを追加する方法"${LOG_FILE:-/dev/null}"毎回繰り返しを避ける方法。

おすすめ記事