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


52

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

some_command 1> output_log_1 output_log_2 2>&1

6
ではzsh、を使用できますsome_command >output_log_1 >output_log_2
ジョフェル

回答:


70

参照man tee

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

概要:ティー[オプション] ... [ファイル] ...

したがって:

echo test | tee file1 file2 file3

stderrも複数のファイルにリダイレクトできますか?
fromnaboo

はい、リダイレクトのおかげで実行できます:find / -name test 2>&1 | tee file1 file2
file3-エイコン

@akond、cmd 2>&1 | tee log1 log2 上記のように実行しようとしましたが、 ctrl-cを押して2番目のログファイルにリダイレクトする必要があります。また、出力はコンソールに出力されます。コマンド出力をコンソールにではなく、ログにリダイレクトしたいのですが。どんな助けも大歓迎です。
ダブルデッカー

@doubledecker teeコマンド書き込みstdinファイルへの(S)としますstdout。出力を端末に表示したくない場合は、/dev/null通常のようにリダイレクトする必要があります。
Minix 14

4
複数のファイルに追加することもできますecho test | tee --append file1 file2
。– user1364368

13

出力が関数から生成されたとしましょうcmd()

cmd() {
    echo hello world!
}

cmdコンソールからではなく、2つのファイルから出力をリダイレクトするには、次を使用できます。

cmd | tee file1 file2 >/dev/null

teeへのデータソースパイプを考えると、これは複数のファイルに対して機能します。

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バージョンで動作するはずです。


@doubledecker-これは条件を満たしているように見えるため、回答として受け入れることができます。また、version 4.3.11(1)-release (i686-pc-linux-gnu)Ubuntu 14.04のGNU bash()でこれをテストしたため、+ 1 。
ベラク14年

9

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

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

echo "foobarbaz" | tee file1 > file2

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

echo "foobarbaz" | tee -a file1 >> file2

これは多かれ少なかれ他の答えが言ったものです(-a ティーを除く)
-Archemar

これが道です。
71GA

5

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

echo foobar >file1 >file2 >file3

または、ブレースを展開した場合:

echo foobar >file{1..3}

内部的には、これteeは上記の回答と非常によく似ています。シェルは、コマンドの標準出力を複数のファイルにパイプするプロセスに接続します。そのため、このようにそれをやってのいずれかの説得力のある技術的な利点は、(それがない良い実を見て)。詳細については、zshマニュアルを参照してください。


2

ただし、コメントすることはできません

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

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

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

2
これは、すでに与えられている他の回答とどう違うのですか?少数の人々は、おそらくリテラルたい、特に以来file1を通してfile8自分の名前と、それらの可能性が高いファイルの名前のための単なる一例のプレースホルダですとして
エリックRenouf

1
多分、これはまさに私が必要とした解決策であり、他の誰かを助けることができると思った。
user149146
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.