etc./StackOverFlow

Bash를 사용하여 표준 출력과 표준 오류를 모두 파일에 리디렉션하고 추가하는 방법

청렴결백한 만능 재주꾼 2022. 1. 4. 06:05
반응형

질문자 :flybywire


Bash에서 표준 출력 을 잘린 파일로 리디렉션하려면 다음을 사용하는 방법을 알고 있습니다.

 cmd > file.txt

파일에 추가하여 Bash에서 표준 출력을 리디렉션하려면 다음을 사용하는 방법을 알고 있습니다.

 cmd >> file.txt

표준 출력과 표준 오류 를 모두 잘린 파일로 리디렉션하려면 다음을 사용하는 방법을 알고 있습니다.

 cmd &> file.txt

파일에 추가하는 표준 출력과 표준 오류를 모두 리디렉션하려면 어떻게 해야 합니까? cmd &>> file.txt 가 작동하지 않았습니다.



cmd >>file.txt 2>&1

Bash는 다음과 같이 왼쪽에서 오른쪽으로 리디렉션을 실행합니다.

  1. >>file.txt : 추가 모드에서 file.txt stdout 리디렉션합니다.
  2. 2>&1 : stderrstdout 이 현재 가고 있는 곳"으로 리디렉션합니다. 이 경우 추가 모드에서 열린 파일입니다. 즉, &1 stdout 현재 사용하는 파일 설명자를 재사용합니다.

Alex Martelli

Bash 버전에 따라 두 가지 방법이 있습니다.

고전적이고 이식 가능한( Bash pre-4 ) 방법은 다음과 같습니다.

 cmd >> outfile 2>&1

Bash 4 로 시작하는 이식 불가능한 방법은 다음과 같습니다.

 cmd &>> outfile

( &> outfile 유사)

좋은 코딩 스타일을 위해서는

  • 이식성이 문제인지 결정(그런 다음 고전적인 방식 사용)
  • Bash pre-4에 대한 이식성이 문제인지 결정하십시오(그런 다음 고전적인 방법을 사용하십시오).
  • 어떤 구문을 사용하든 동일한 스크립트 내에서 변경하지 마십시오(혼란!)

스크립트가 이미 #!/bin/sh 시작하는 경우(의도 여부에 관계없이) Bash 4 솔루션과 일반적으로 Bash 관련 코드는 적합하지 않습니다.

또한 Bash 4 &>> 는 구문이 더 짧다는 것을 기억하십시오. 새로운 기능이나 이와 유사한 것을 도입하지 않습니다.

구문은 (다른 리디렉션 구문 옆에) 여기에 설명되어 있습니다: http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output


TheBonsai

Bash에서는 다른 파일에 대한 리디렉션을 명시적으로 지정할 수도 있습니다.

 cmd >log.out 2>log_error.out

추가는 다음과 같습니다.

 cmd >>log.out 2>>log_error.out

Aaron R.

Bash 4( Z 쉘 ( zsh ) 4.3.11 뿐만 아니라):

 cmd &>> outfile

바로 사용할 수 있습니다.


A B

이것은 잘 작동합니다:

 your_command 2>&1 | tee -a file.txt

모든 로그를 file.txt에 저장하고 터미널에 덤프합니다.


Pradeep Goswami

이 시도:

 You_command 1> output.log 2>&1

&> x.file 사용은 Bash 4에서 작동합니다. 죄송합니다. (

여기에 몇 가지 추가 팁이 있습니다.

0, 1, 2, ..., 9는 bash의 파일 설명자입니다.

0은 표준 입력 , 1은 표준 출력 , 2는 표준 오류를 나타냅니다. 3~9는 기타 임시 사용을 위한 여유 공간입니다.

> 또는 >> (추가)를 사용하여 다른 파일 설명자 또는 파일로 리디렉션될 수 있습니다.

사용법: < file_descriptor > > < 파일 이름 | 파일 설명자(&file_descriptor) >

20장. I/O 리디렉션 의 참조를 참조하십시오.


Quintus.Zhou

또 다른 접근 방식:

&>> 를 사용할 수 없는 이전 버전의 Bash를 사용하는 경우 다음을 수행할 수도 있습니다.

 (cmd 2>&1) >> file.txt

cmd >> file.txt 2>&1 의 기존 접근 방식보다 덜 효율적이며 결과적으로 현재 쉘을 수정해야 하는 명령(예: cd , pushd )에서는 작동하지 않지만 이 접근 방식은 나에게 더 자연스럽고 이해하기 쉬운 느낌:

  1. 표준 오류를 표준 출력으로 리디렉션합니다.
  2. 파일에 추가하여 새 표준 출력을 리디렉션합니다.

또한 괄호는 특히 표준 출력과 표준 오류를 다른 명령으로 파이프하려는 경우 모호한 순서를 제거합니다.

서브쉘을 시작하지 않으려면 괄호 대신 중괄호를 사용하여 그룹 명령 을 생성할 수 있습니다.

 { cmd 2>&1; } >> file.txt

(그룹 명령을 종료하려면 세미콜론(또는 개행)이 필요합니다.)


jamesdlin

내부 스크립트에서 리디렉션

스크립트 자체에서 리디렉션을 계획할 수 있습니다.

 #!/bin/bash exec 1>>logfile.txt exec 2>&1 /bin/ls -ld /tmp /tnt

이것을 실행하면 다음을 포함하는 logfile.txt

 /bin/ls: cannot access '/tnt': No such file or directory drwxrwxrwt 2 root root 4096 Apr 5 11:20 /tmp

다양한 파일에 로그인

하나의 전체 로그에 추가하고 다른 마지막 로그를 다시 만드는 두 개의 다른 로그 파일을 만들 수 있습니다.

 #!/bin/bash if [ -e last.log ] ;then mv -f last.log last.old fi exec 1> >(tee -a overall.log /dev/tty >last.log) exec 2>&1 ls -ld /tnt /tmp

이 스크립트를 실행하면

  • 경우 last.log 이미 존재하는 이름을 바꿀 last.old (덮어 쓰기 last.old 존재하는 경우).
  • 새로운 last.log .
  • overall.log 모든 것을 추가하십시오.
  • 터미널에 모든 것을 출력합니다.

단순 결합 로그

 #!/bin/bash [ -e last.err ] && mv -f last.err lasterr.old [ -e last.log ] && mv -f last.log lastlog.old exec 2> >(tee -a overall.err combined.log /dev/tty >last.err) exec 1> >(tee -a overall.log combined.log /dev/tty >last.log) ls -ld /tnt /tmp

그래서 당신은

  • last.log 마지막 실행 로그 파일
  • last.err 마지막 실행 오류 파일
  • lastlog.old 이전 실행 로그 파일
  • lasterr.old 이전 실행 오류 파일
  • overall.log 추가된 전체 로그 파일
  • 전반적인 오류 파일이 추가된 전체 overall.err
  • combined.log 전체 오류를 추가하고 결합된 파일을 기록합니다.
  • 여전히 터미널로 출력

F. Hauri

출처 : http:www.stackoverflow.com/questions/876239/how-to-redirect-and-append-both-standard-output-and-standard-error-to-a-file-wit

반응형