ProgramingTip

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

bestdevel 2020. 9. 28. 09:38
반응형

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


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

호출 foo > output은 해당 명령의 출력을 지정된 파일 (이 경우 '출력')로 리디렉션합니다.

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


원하는 명령의 이름은 다음과 달라집니다 .tee

foo | tee output.file

예를 들어, stdout에만 관심이있는 사람 :

ls -a | tee output.file

다음을 수행하십시오.

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

2>&1채널 2 (표준 출력 / 표준 오류)를 채널 1 (표준 출력 / 표준 출력)으로 리디렉션하여 둘 다 표준 출력으로 기록합니다. 또한 tee명령 에서 주어진 출력 파일로 지정 됩니다.

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

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

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

2>&1stderr 및 stdout 스트림을 유지합니다. tee outfile스트림을 받아 화면과 "outfile"파일에 기록합니다.

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

문제는 (stdout과 stderr 스트림을 혼합 할 때) 프로그램에 의해 밸류되는 것입니다. 예를 들어 stdout에 대한 모든 쓰기가 플러시 아니지만 stderr에 대한 모든 쓰기 플러시되면 출력 파일과 화면에서 시간이 끝납니다.

프로그램이 진행 상황을보고하기 위해 몇 분마다 한두 줄만 출력하는 것도 나쁘다. 이 경우 출력이 프로그램에 의해 플러시되지 않은 프로그램 사용자는 몇 시간 동안 파이프를 통해 푸시되지 않기 때문에 몇 시간 동안 화면에 출력을 볼 수도 없습니다.

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

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

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

<command> |& tee  <outputFile>

gnu bash 매뉴얼에 대로

예 :

ls |& tee files.txt

'| & '를 사용하면 표준 출력 외에 command1의 표준 오류 가 파이프를 통해 command2의 표준 입력에 연결됩니다. 그것은 2> & 1 표현됩니다 |. 표준 출력에 대한 표준 오류의 암시 적 수행 리디렉션은 명령으로 지정된 리디렉션 후에 처리됩니다.

자세한 내용은 리디렉션을 참조하십시오.


주로 Zoredache 솔루션을 사용할 수 있도록 파일을 작성하는 옵션으로 다음과 같이 -a 옵션으로 작성해야합니다.

ls -lR / | tee -a output.file

추가 할 사항 ...

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

문제를 제쳐두고

다음은 나를 위해 일했습니다.

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

감사합니다 SCDF & 매튜 귀하의 입력으로 많은 시간을 절약 했습니다 ..


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


이 유스 케이스 이후로 보너스 답변 :

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

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

에코가 발생하고 파일 쓰기가 "some_user"로 발생한다는 점에 유의하십시오. 에코를 "some_user" 로 실행하고 출력을 >> "some_file"로 리디렉션하면 파일 리디렉션 작동 작동하지 않습니다. 당신처럼.

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


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

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

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

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

스크립트 시작 부분에 다음과 같이 사용하여 전체 스크립트에 대해이를 수행 할 수 있습니다.

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

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


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

ls -lr / > output | cat output

참고 URL : https://stackoverflow.com/questions/418896/how-to-redirect-output-to-a-file-and-stdout

반응형