터미널에 내용을 표시하지 않고 표준 출력을 파일로 리디렉션하는 방법은 무엇입니까?

터미널에 내용을 표시하지 않고 표준 출력을 파일로 리디렉션하는 방법은 무엇입니까?

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

관련 정보