web-dev-qa-db-ja.com

出力を複数のログファイルにリダイレクトする方法

標準出力を複数のログファイルにリダイレクトする方法以下は機能しません。

some_command 1> output_log_1 output_log_2 2>&1
55
doubledecker

見る man tee

NAME:tee-標準入力から読み取り、標準出力とファイルに書き込みます

概要:Tシャツ[オプション] ... [ファイル] ...

したがって:

echo test | tee file1 file2 file3
73
akond

出力が関数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バージョン。

13
K. P. MacGregor

古い投稿ですが、今見つけました...

出力を> /dev/nullにリダイレクトする代わりに、最後のファイルにリダイレクトできます。

echo "foobarbaz" | tee file1 > file2

または、出力を追加する場合:

echo "foobarbaz" | tee -a file1 >> file2
10
James Cook

回答の下のコメントで@jofelが言及したように、これはzshでネイティブに実行できます。

echo foobar >file1 >file2 >file3

または、ブレース拡張を使用:

echo foobar >file{1..3}

内部的には、これは上記のtee回答と非常によく似ています。シェルは、コマンドのstdoutを、複数のファイルにパイプするプロセスに接続します。したがって、この方法を使用することには説得力のある技術的な利点はありません(ただし、本当によく見えます)。詳細は the zsh manual を参照してください。

5
strugee

コメントすることはできませんが、表現する別の方法

echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null

多くのファイルを扱う場合、これに簡略化できます。

echo "foobarbaz" | tee file{1..8} > /dev/null
2
user149146