TL;DR
command > >(tee -a stdout.log) 2> >(tee -a stderr.log >&2)
背景など
スクリプトを実行するときに、ログとして標準出力と標準エラー出力を画面に表示しつつ、ファイルにも残したかった。
その時はscriptコマンドのことを忘れていたけれど、あるスクリプトの実行ログそのものを残したくて失敗して再実行するときの操作などは残らない方法を探した。ということにしておきます。
ググって出てきたStack Overflowそのままですが解説としては
>( ... )
部分は標準出力をファイル(file descriptor)ではなく...
部分のコマンドの標準入力に流し込むための記法。- 逆に、コマンドの標準出力をファイルからの入力のように扱うのは
<( command )
。 - (複数コマンドの出力を
cat
で束ねたり、複数のコマンドの出力をdiff
で差分とるときに使うやつ)
- 逆に、コマンドの標準出力をファイルからの入力のように扱うのは
>
は標準出力をファイルに流すリダイレクト、2>
は標準エラー出力をファイルに流すリダイレクト>&2
は標準出力を標準エラー出力にリダイレクトしている