UNIXシェルスクリプトエラーを記録する最善の方法は何ですか

UNIXシェルスクリプトエラーを記録する最善の方法は何ですか

あなたによると、スクリプトエラーを記録する最良の方法は何ですか?

以下を試しましたが、何も達成されていないようです。 (例外を追加しました。)ユーザーに権限がないため、この検索コマンドは機能しません。/ホーム/データ/職場/ディレクトリ

1.)

$(find /home/data/work/. -type f -delete) >log.txt 2>&1

これは私の電子メールに何も書きません。ログ.txt

2.)

find /home/data/work/. -type f -delete >log.txt 2>log.txt

ここで $() なしでコマンドを実行するのは間違っているようです。

3.)

function log_this() {
echo "$(date): $*" | tee -a log.txt
}
$(find /home/data/work/. -type f -delete) || { log_this "error"; exit 1; }

これはメッセージ「エラー」をログファイルに書き込みますが、ここではコマンドからlog_this関数にエラーをリダイレクトできません。

スクリプトログを生成する良い方法はありますか? $()を使用して、カスタムメッセージと生のエラーをログファイルに書き込むことができます。

答え1

次のいずれかで正しいソリューションをバイパスしているようです。

  1. の出力をfindコマンドとして実行します(findオプション1と3のようにコマンド置換に使用し、そのコマンド置換をコマンドとして使用すると発生します)。または
  2. 出力ストリームとエラーストリームをにリダイレクトしますlog.txt

正しい変化は

find ... >log.txt 2>&1

つまり、コマンドを実行して出力をファイルにリダイレクトし、エラーストリームも標準出力がある場所にリダイレクトします。

エラーのみを記録するには、標準出力をリダイレクトしないでください。

find ... 2>log.txt

moreutilsパッケージには、tsコマンド出力からタイムスタンプを取得するために使用できるコマンドがあります。

find ... 2>&1 >/dev/null | ts >log.txt

上記のコマンドは標準出力を削除しますfindが、エラー出力にタイムスタンプを追加しますlog.txt

関連情報