しばらく前にスクリプトを作成し、その周りにロギングを追加しましたが、ロギングリダイレクトがどのように機能するかを忘れていました。 :-(
主な点は次のとおりです。
#!/bin/bash
LOGFILE=/some/path/mylogfile
(
# here go my commands which produce some stdout
# and, if something goes wrong, also some stderr
) 1>>${LOGFILE} 2> >( tee -a ${LOGFILE} >&2 )
スクリプトを実行すると、何も印刷されず、stdout
内容だけが印刷されますstderr
。ログファイルは${LOGFILE}
標準出力と標準エラーをキャプチャします。
スクリプトを実行すると、すべてが正常で端末に出力がないことがわかります。出力がある場合は問題が発生したことがわかり、ログファイルを調べて問題が何であるかを確認できます。
今私を混乱させるリダイレクト部分は次の構文です。2> >( some command )
そこで何が起こっているのかを説明できる人はいますか?
答え1
>(...)
~と呼ばれるプロセスの交換。これにより、「外部」プログラムがファイルのように「内部」プログラムに書き込むことができます。
この場合は、追加する内容を作成してstderr
から、すべての内容を再作成してください。tee -a ${LOGFILE} >&2
LOGFILE
stderr
リダイレクト演算子は任意の方向にプロセス置換を実行できるため、ここに書くことも(この例のように)読み取ることもできます。これは、たとえばループ自体を実行するために実行するのに<(...)
便利な方法です。while