etc./StackOverFlow

출력을 파일 및 표준 출력으로 리디렉션하는 방법

청렴결백한 만능 재주꾼 2023. 4. 28. 04:05
반응형

질문자 :SCdF


bash에서 foo 호출하면 해당 명령의 모든 출력이 stdout에 표시됩니다.

foo > output 호출하면 해당 명령의 모든 출력이 지정된 파일(이 경우 '출력')로 리디렉션됩니다.

리디렉션 출력 할 수있는 방법은 파일에 있는가 그것은 표준 출력에 표시 한?



원하는 명령의 이름은 tee .

 foo | tee output.file

예를 들어 stdout에만 관심이 있는 경우:

 ls -a | tee output.file

stderr을 포함하려면 다음을 수행하십시오.

 program [arguments...] 2>&1 | tee outfile

2>&1 채널 2(표준 오류/표준 오류)를 채널 1(표준 출력/표준 출력)으로 리디렉션하여 둘 다 표준 출력으로 기록되도록 합니다. tee 명령으로 지정된 출력 파일로 지정됩니다.

또한 로그 파일 에 추가 tee -a 를 다음과 같이 사용하십시오.

 program [arguments...] 2>&1 | tee -a outfile

Zoredache

$ program [arguments...] 2>&1 | tee outfile

2>&1 은 stderr 및 stdout 스트림을 덤프합니다. tee outfile 은 스트림을 가져와서 화면과 "outfile" 파일에 씁니다.

이것은 아마도 대부분의 사람들이 찾고 있는 것입니다. 가능한 상황은 일부 프로그램이나 스크립트가 오랫동안 열심히 일하고 많은 출력을 생성하는 것입니다. 사용자는 진행 상황을 주기적으로 확인하고 싶지만 출력을 파일에 기록하기를 원합니다.

문제(특히 stdout 및 stderr 스트림을 혼합할 때)는 프로그램에 의해 플러시되는 스트림에 대한 의존도가 있다는 것입니다. 예를 들어, stdout에 대한 모든 쓰기가 플러시되지 않고 stderr에 대한 모든 쓰기 플러시되면 출력 파일과 화면에서 시간 순서가 맞지 않게 됩니다.

프로그램이 진행 상황을 보고하기 위해 몇 분마다 1 또는 2줄만 출력하는 경우에도 좋지 않습니다. 이러한 경우 프로그램에서 출력을 플러시하지 않으면 사용자는 몇 시간 동안 화면에 어떤 출력도 표시되지 않습니다. 왜냐하면 어느 것도 파이프를 통해 몇 시간 동안 푸시되지 않기 때문입니다.

업데이트: expect 패키지의 일부인 unbuffer 프로그램은 버퍼링 문제를 해결합니다. 이렇게 하면 stdout 및 stderr이 화면과 파일에 즉시 기록되고 결합되어 tee 리디렉션될 때 동기화된 상태로 유지됩니다. 예:

 $ unbuffer program [arguments...] 2>&1 | tee outfile

Matthew Alpert

저에게 효과적인 또 다른 방법은,

 <command> |& tee <outputFile>

gnu bash 설명서에 표시된 대로

예시:

 ls |& tee files.txt

'|&'를 사용하면 command1의 표준 오류표준 출력 과 함께 파이프를 통해 command2의 표준 입력에 연결됩니다. 2>&1 |의 줄임말입니다. 표준 출력에 대한 표준 오류의 암시적 리디렉션은 명령에 의해 지정된 리디렉션 후에 수행됩니다.

자세한 내용은 리디렉션을 참조하세요.


tsenapathy

주로 Zoredache 솔루션을 사용할 수 있지만 출력 파일을 덮어쓰지 않으려면 다음과 같이 -a 옵션을 사용하여 tee를 작성해야 합니다.

 ls -lR / | tee -a output.file

O.Badr

추가할 사항 ...

패키지 unbuffer는 fedora 및 redhat unix 릴리스에서 일부 패키지에 대한 지원 문제가 있습니다.

문제를 제쳐두고

나를 위해 일한 다음

 bash myscript.sh 2>&1 | tee output.log

ScDF매튜 감사합니다. 귀하의 입력으로 많은 시간을 절약할 수 있었습니다.


nitinr708

tail -f output 사용하면 작동합니다.


Chuck Phillips

스크립트 시작 부분에 다음과 같은 것을 사용하여 전체 스크립트에 대해 그렇게 할 수 있습니다.

 #!/usr/bin/env bash test x$1 = x$'\x00' && shift || { set -o pipefail ; ( exec 2>&1 ; $0 $'\x00' "$@" ) | tee mylogfile ; exit $? ; } # do whaetever you want

이것은 stderr 및 stdout 출력을 mylogfile 이라는 파일로 리디렉션하고 모든 것이 동시에 stdout으로 이동하도록 합니다.

그것은 몇 가지 어리석은 트릭을 사용합니다.

  • exec 를 사용하여 리디렉션을 설정하고,
  • tee 를 사용하여 출력을 복제하고,
  • 원하는 리디렉션으로 스크립트를 다시 시작하고,
  • 특별한 첫 번째 매개변수( $'string' 특수 bash 표기법으로 지정된 NUL 문자)를 사용하여 스크립트가 다시 시작되도록 지정합니다(원래 작업에서 동등한 매개변수를 사용할 수 없음).
  • pipefail 옵션을 사용하여 스크립트를 다시 시작할 때 원래 종료 상태를 유지하십시오.

추악하지만 특정 상황에서 유용합니다.


Bruno BEAUFILS

이 사용 사례가 저를 여기로 데려온 이후의 보너스 답변:

다른 사용자로 이 작업을 수행해야 하는 경우

 echo "some output" | sudo -u some_user tee /some/path/some_file

에코는 사용자와 같이 발생하고 파일 쓰기는 "some_user"로 발생합니다. 작동하지 않는 것은 "some_user"로 에코를 실행하고 파일 리디렉션이 발생하기 때문에 >> "some_file"로 출력을 리디렉션하는 경우입니다. 당신처럼.

힌트: tee는 또한 -a 플래그와 함께 추가를 지원합니다. 파일의 줄을 다른 사용자로 교체해야 하는 경우 원하는 사용자로 sed를 실행할 수 있습니다.


jorfus

< command > |& tee filename # 명령 상태를 내용으로 "filename" 파일을 생성합니다. 파일이 이미 존재하는 경우 존재하는 내용을 제거하고 명령 상태를 기록합니다.

< command > | tee >> filename # 이것은 파일에 상태를 추가하지만 standard_output(화면)에 명령 상태를 인쇄하지 않습니다.

화면에서 "에코"를 사용하여 무언가를 인쇄하고 해당 에코 데이터를 파일에 추가하고 싶습니다.

 echo "hi there, Have to print this on screen and append to a file"

kiran sai

tee는 이것에 완벽하지만 이것은 또한 일을 할 것입니다

 ls -lr / > output | cat output

kal

출처 : http:www.stackoverflow.com/questions/418896/how-to-redirect-output-to-a-file-and-stdout

반응형