標準出力を複数のログファイルにリダイレクトする方法以下は機能しません。
some_command 1> output_log_1 output_log_2 2>&1
見る man tee
:
NAME:tee-標準入力から読み取り、標準出力とファイルに書き込みます
概要:Tシャツ[オプション] ... [ファイル] ...
したがって:
echo test | tee file1 file2 file3
出力が関数cmd()
から生成されたとしましょう:
cmd() {
echo hello world!
}
cmd
からの出力をコンソールではなく2つのファイルにリダイレクトするには、次のコマンドを使用できます。
cmd | tee file1 file2 >/dev/null
これは、Tへのデータソースパイプを指定すると、複数のファイルに対して機能します。
echo "foobarbaz" | tee file1 file2 file3 file4 > /dev/null
これも機能します:
echo $(cmd) | tee file1 file2 >/dev/null
/dev/null
リダイレクトがない場合、teeは指定されたファイルに加えて出力をstdoutに送信します。
たとえば、これをコンソールから実行すると、そこに出力が表示されます。 crontabから実行すると、メールで送信されるステータスメッセージが出力に表示されます(Gillesの回答 https://unix.stackexchange.com/a/100833/3998 も参照)。
これは私にとってUbuntu 12.04のbashで機能し、Ubuntu 14.04でGNU bash 4.3.11(1)を使用して確認されているため、最近のGNU bashバージョン。
古い投稿ですが、今見つけました...
出力を> /dev/null
にリダイレクトする代わりに、最後のファイルにリダイレクトできます。
echo "foobarbaz" | tee file1 > file2
または、出力を追加する場合:
echo "foobarbaz" | tee -a file1 >> file2
回答の下のコメントで@jofelが言及したように、これはzsh
でネイティブに実行できます。
echo foobar >file1 >file2 >file3
または、ブレース拡張を使用:
echo foobar >file{1..3}
内部的には、これは上記のtee
回答と非常によく似ています。シェルは、コマンドのstdoutを、複数のファイルにパイプするプロセスに接続します。したがって、この方法を使用することには説得力のある技術的な利点はありません(ただし、は本当によく見えます)。詳細は the zsh
manual を参照してください。
コメントすることはできませんが、表現する別の方法
echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null
多くのファイルを扱う場合、これに簡略化できます。
echo "foobarbaz" | tee file{1..8} > /dev/null