출력을 파일과 stdout으로 리디렉션하는 방법
bash를 호출한다.foo
스투우트
" "foo > output
는, 그 커맨드의 출력을 지정된 파일(이 경우는 「output」)로 리다이렉트 합니다.
출력을 파일로 리다이렉트하여 stdout에 표시하는 방법이 있습니까?
필요한 명령어의 이름은 다음과 같습니다.
foo | tee output.file
예를 들어 stdout에만 관심이 있는 경우:
ls -a | tee output.file
stderr을 포함하려면 다음 작업을 수행합니다.
program [arguments...] 2>&1 | tee outfile
2>&1
는 채널 2(stderr/표준 오류)를 채널 1(stdout/표준 출력)로 리다이렉트하여 둘 다 stdout으로 씁니다., 음, 력 일 조 습 파 니 있 the directed it is수다 of file output참할출또 to도 also의다 as the given the directed it is file oftee
명령어를 입력합니다.
또한 로그 파일에 추가하려면tee -a
as:다음과 같이 합니다.
program [arguments...] 2>&1 | tee -a outfile
$ program [arguments...] 2>&1 | tee outfile
2>&1
dumps the stderr and stdout streams.stderr 스트림과 stdout 스트림을 덤프합니다. tee outfile
스트리밍을 찍고 파일 "아웃 파일"을 파일에 기록합니다.가져온 스트림을 화면과 "outfile" 파일에 씁니다.
이것은 아마도 대부분의 사람들이 찾고 있는 것이다.프로그램이나 스크립트가 장시간 작업하여 많은 출력을 내고 있는 경우가 있습니다.사용자는 진행 상황을 정기적으로 확인하지만 출력도 파일에 기록하려고 합니다.
(특히 stdout 스트림과 stderr 스트림을 혼합할 때) 문제는 프로그램에 의해 플러시되는 스트림에 의존한다는 것입니다.예를 들어 stdout에 대한 모든 쓰기가 지워지지 않았지만 stderr에 대한 쓰기가 모두 지워진 경우 출력 파일과 화면에서 시간 순서대로 지워집니다.
프로그램이 진행 상황을 보고하기 위해 몇 분마다 1~2줄만 출력하는 것도 좋지 않습니다.이 경우 프로그램에 의해 출력이 플러시되지 않으면 몇 시간 동안 파이프에 삽입되지 않기 때문에 사용자는 몇 시간 동안 화면에 출력조차 볼 수 없습니다.
업데이트: 프로그램 이 프로그램 데 그 램 로)unbuffer
, 의 일 부 part)expect
패키지를 사용하면 버퍼링 문제가 해결됩니다.에 의해, 와 는 해, 조합해 「」, 「stdout」의 stderr 로 때에 합니다.tee
예:
$ unbuffer program [arguments...] 2>&1 | tee outfile
또 다른 방법은
<command> |& tee <outputFile>
예:
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
작동해야 합니다.
저 같은 경우에는 Java 프로세스에서 출력 로그를 사용하고 있었습니다.출력 로그를 표시하고 파일(여기서 log file이라고 하는 이름)로 리다이렉트 하는 가장 간단한 솔루션은 다음과 같습니다.
my_java_process_run_script.sh |& tee logfile
그 결과 Java 프로세스가 실행되어 출력 로그가 표시되고 이름 로그 파일이 있는 파일에 저장되었습니다.
스크립트의 선두에 다음과 같은 것을 사용하는 것으로, 스크립트 전체에 대해서 이것을 실행할 수 있습니다.
#!/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
모든 게 동시에 시작되도록 놔두죠
그것은 몇 가지 어리석은 속임수를 쓴다.
exec
를 사용하지 않고을 설정하다tee
복제하다- 원하는 리다이렉션을 사용하여 스크립트를 재시작합니다.
- 한 첫 매개 변수한 첫 번째 매개 )를 사용합니다.
NUL
「」로 .$'string'
표기법할 수 없습니다). - 할 때 원래 .
pipefail
★★★★★★ 。
못생겼지만 상황에 따라서는 도움이 됩니다.
이 사용 사례로 인해 다음과 같은 답변이 있었습니다.
다른 사용자로서 이 작업을 수행해야 하는 경우
echo "some output" | sudo -u some_user tee /some/path/some_file
에코는 사용자와 파일 쓰기가 "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"
티는 이것에 완벽하지만, 이것 또한 일을 할 수 있을 것이다.
ls -lr / > output | cat output
언급URL : https://stackoverflow.com/questions/418896/how-to-redirect-output-to-a-file-and-stdout
'programing' 카테고리의 다른 글
Ansible을 사용하여 새 사용자 및 암호 만들기 (0) | 2023.04.19 |
---|---|
열 F의 날짜가 오늘 날짜와 동일한 경우 조건부 형식을 사용하여 행 강조 표시 (0) | 2023.04.19 |
공유 호스트의 "LOG_BACKUP" 때문에 데이터베이스의 트랜잭션 로그가 가득 찼습니다." (0) | 2023.04.19 |
python 목록의 n번째 요소 또는 기본값을 가져오는 방법(사용할 수 없는 경우) (0) | 2023.04.19 |
폴더를 선택하도록 OpenFileDialog를 구성하려면 어떻게 해야 합니까? (0) | 2023.04.19 |