tee
端末に stdout を表示します。やりたくありませんが、オプションが見つかりません。
|| visible in terminal || visible in file || existing
Syntax || StdOut | StdErr || StdOut | StdErr || file
==========++==========+==========++==========+==========++===========
> || no | yes || yes | no || overwrite
>> || no | yes || yes | no || append
|| | || | ||
2> || yes | no || no | yes || overwrite
2>> || yes | no || no | yes || append
|| | || | ||
&> || no | no || yes | yes || overwrite
&>> || no | no || yes | yes || append
|| | || | ||
| tee || yes | yes || yes | no || overwrite
| tee -a || yes | yes || yes | no || append
|| | || | ||
n.e. (*) || yes | yes || no | yes || overwrite
n.e. (*) || yes | yes || no | yes || append
|| | || | ||
|& tee || yes | yes || yes | yes || overwrite
|& tee -a || yes | yes || yes | yes || append
答え1
> file
[質問を編集してください。最初の行から単にリダイレクトすると、タイトルはわかりません。]
欠落している行は次のようになります。強く打つリダイレクト+プロセスの交換と組み合わせます2> >(...)
。> >(...)
たとえば、最も有用な場合(最後の完全な表を参照):
# both stderr+stdout to the tty, only stderr to the file
$ ls -d /etc /etx 2> >(tee file)
/etc
ls: cannot access '/etx': No such file or directory
$ cat file
ls: cannot access '/etx': No such file or directory
これは> >(...)
面倒で問題になることが多いです。正常に動作していても、stdoutとstderrが混乱したり、プロンプトの後に表示されることがあります。
bash$ sh -c 'sleep .1; ls -d /etc /etx' 2> >(tee errors)
ls: cannot access '/etx'/etc
: No such file or directory
bash$ ls -d /etc /etx 2> >(sleep .1; tee errors)
/etc
bash$ ls: cannot access '/etx': No such file or directory
移植可能な場合は、stdoutとstderrを次のように交換します3>&2 2>&1 >&3 3>&-
。
$ ls -d /etc /etx 3>&1 >&2 2>&3 3>&- | cat | tee file
ls: cannot access '/etx': No such file or directory
/etc
$ cat file
ls: cannot access '/etx': No such file or directory
注:ティーの入力バッファを防ぐには、「役に立たない」猫stdbuf -i0 tee file
も必要です。異なる出力を混ぜ合わせるといつもこれは、同じ場所に複数のプロセスを書き込む場合に問題になります。私が知っている限り、fprintf
アプリケーション自体内で実際の呼び出しと同様の呼び出しを傍受しなくても問題を解決する方法はありません。
シート
追加テーブルは省略されます。とtee file
に変更すると簡単に入手できます。これらのコマンドが対話型端末でのみ実行されることを意図している場合は、単純化できます。tee -a file
>file
>>file
... tee /dev/fd/3 ... 3 >&1 or 3>&2 ...
tee /dev/tty
強く打つ
TERMINAL FILE
OUT ERR OUT ERR
yes yes yes yes cmd |& tee file
yes yes yes no cmd | tee file
yes yes no yes cmd 2> >(tee file)
yes yes no no cmd
yes no yes yes (cmd | tee /dev/fd/3) 3>&1 &>file
yes no yes no cmd 2>/dev/null | tee file
yes no no yes cmd 2>file
yes no no no cmd 2>/dev/null
no yes yes yes (cmd 2> >(tee /dev/fd/3)) 3>&2 &>file
no yes yes no cmd >file
no yes no yes cmd 2> >(tee file) >/dev/null
no yes no no cmd >/dev/null
no no yes yes cmd &>file
no no yes no cmd >file 2>/dev/null
no no no yes cmd >/dev/null 2>file
no no no no cmd &>/dev/null
標準/空/sh
TERMINAL FILE
OUT ERR OUT ERR
yes yes yes yes cmd 2>&1 | tee file
yes yes yes no cmd | tee file
yes yes no yes cmd 3>&2 2>&1 >&3 3>&- | tee file
yes yes no no cmd
yes no yes yes (cmd | tee /dev/fd/3) 3>&1 >file 2>&1
yes no yes no cmd 2>/dev/null | tee file
yes no no yes cmd 2>file
yes no no no cmd 2>/dev/null
no yes yes yes (cmd 4>&2 2>&1 >&4 4>&- | tee /dev/fd/3) 3>&1 >file 2>&1
no yes yes no cmd >file
no yes no yes cmd 2>&1 >/dev/null | tee file
no yes no no cmd >/dev/null
no no yes yes cmd >file 2>&1
no no yes no cmd >file 2>/dev/null
no no no yes cmd >/dev/null 2>file
no no no no cmd >/dev/null 2>&1