bash에서 foo
호출하면 해당 명령의 모든 출력이 stdout에 표시됩니다.
foo > output
호출하면 해당 명령의 모든 출력이 지정된 파일(이 경우 '출력')로 리디렉션됩니다.
리디렉션 출력 할 수있는 방법은 파일에 있는가 그것은 표준 출력에 표시 한?
질문자 :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
$ 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
저에게 효과적인 또 다른 방법은,
<command> |& tee <outputFile>
gnu bash 설명서에 표시된 대로
예시:
ls |& tee files.txt
'|&'를 사용하면 command1의 표준 오류 가 표준 출력 과 함께 파이프를 통해 command2의 표준 입력에 연결됩니다. 2>&1 |의 줄임말입니다. 표준 출력에 대한 표준 오류의 암시적 리디렉션은 명령에 의해 지정된 리디렉션 후에 수행됩니다.
자세한 내용은 리디렉션을 참조하세요.
주로 Zoredache 솔루션을 사용할 수 있지만 출력 파일을 덮어쓰지 않으려면 다음과 같이 -a 옵션을 사용하여 tee를 작성해야 합니다.
ls -lR / | tee -a output.file
추가할 사항 ...
패키지 unbuffer는 fedora 및 redhat unix 릴리스에서 일부 패키지에 대한 지원 문제가 있습니다.
문제를 제쳐두고
나를 위해 일한 다음
bash myscript.sh 2>&1 | tee output.log
tail -f output
사용하면 작동합니다.
스크립트 시작 부분에 다음과 같은 것을 사용하여 전체 스크립트에 대해 그렇게 할 수 있습니다.
#!/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
옵션을 사용하여 스크립트를 다시 시작할 때 원래 종료 상태를 유지하십시오.추악하지만 특정 상황에서 유용합니다.
이 사용 사례가 저를 여기로 데려온 이후의 보너스 답변:
다른 사용자로 이 작업을 수행해야 하는 경우
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 "hi there, Have to print this on screen and append to a file"
tee는 이것에 완벽하지만 이것은 또한 일을 할 것입니다
ls -lr / > output | cat output
출처 : http:www.stackoverflow.com/questions/418896/how-to-redirect-output-to-a-file-and-stdout
쉘 스크립트의 YYYY-MM-DD 형식 날짜 (0) | 2023.04.28 |
---|---|
JavaScriptSerializer - 열거형을 문자열로 JSON 직렬화 (0) | 2023.04.28 |
Vim에서 remap, noremap, nnoremap 및 vnoremap 매핑 명령의 차이점은 무엇입니까? (0) | 2023.04.28 |
목록 이해에서 if/else (0) | 2023.04.28 |
jQuery 드롭다운에서 선택한 옵션 가져오기 (0) | 2023.04.28 |