端末にコンテンツを表示せずに標準出力をファイルにリダイレクトする方法は?

端末にコンテンツを表示せずに標準出力をファイルにリダイレクトする方法は?

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

関連情報