回答:
参照man tee:
NAME:tee-標準入力から読み取り、標準出力とファイルに書き込みます
概要:ティー[オプション] ... [ファイル] ...
したがって:
echo test | tee file1 file2 file3
cmd 2>&1 | tee log1 log2 上記のように実行しようとしましたが、 ctrl-cを押して2番目のログファイルにリダイレクトする必要があります。また、出力はコンソールに出力されます。コマンド出力をコンソールにではなく、ログにリダイレクトしたいのですが。どんな助けも大歓迎です。
teeコマンド書き込みstdinファイルへの(S)ともしますstdout。出力を端末に表示したくない場合は、/dev/null通常のようにリダイレクトする必要があります。
echo test | tee --append file1 file2
出力が関数から生成されたとしましょう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バージョンで動作するはずです。
version 4.3.11(1)-release (i686-pc-linux-gnu)Ubuntu 14.04のGNU bash()でこれをテストしたため、+ 1 。
@jofelが答えの下のコメントで言及したように、これはネイティブで行うことができますzsh:
echo foobar >file1 >file2 >file3
または、ブレースを展開した場合:
echo foobar >file{1..3}
内部的には、これteeは上記の回答と非常によく似ています。シェルは、コマンドの標準出力を複数のファイルにパイプするプロセスに接続します。そのため、このようにそれをやってのいずれかの説得力のある技術的な利点は、(それがないん良い実を見て)。詳細については、zshマニュアルを参照してください。
ただし、コメントすることはできません
echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null
多くのファイルを扱う場合、これに簡略化できます。
echo "foobarbaz" | tee file{1..8} > /dev/null
file1を通してfile8自分の名前と、それらの可能性が高いファイルの名前のための単なる一例のプレースホルダですとして
zsh、を使用できますsome_command >output_log_1 >output_log_2。