[linux] Bash가있는 파일에 stdout과 stderr을 리디렉션하고 추가하는 방법은 무엇입니까?

Bash에서 stdout 을 잘린 파일로 리디렉션하려면 다음을 사용하는 것을 알고 있습니다.

cmd > file.txt

Bash에서 stdout 을 리디렉션 하여 파일에 추가하려면 다음을 사용하는 것을 알고 있습니다.

cmd >> file.txt

stdoutstderr 을 잘린 파일로 리디렉션하려면 다음을 사용하는 것이 좋습니다.

cmd &> file.txt

stdoutstderr 을 파일에 추가하여 리디렉션하는 방법은 무엇입니까? cmd &>> file.txt나를 위해 일하지 않았다.



답변

cmd >>file.txt 2>&1

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

  1. >>file.txt: file.txt추가 모드로 열고 리디렉션 stdout합니다.
  2. 2>&1: “현재가 곳”으로 리디렉션 stderr합니다 . 이 경우 추가 모드에서 열린 파일입니다. 즉, 현재 사용중인 파일 디스크립터를 재사용 합니다.stdout&1stdout

답변

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에 설명되어 있습니다.


답변

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

cmd >log.out 2>log_error.out

추가는 다음과 같습니다.

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


답변

Bash 4 (ZSH 4.3.11)에서 :

cmd &>>outfile

상자에서 바로


답변

이것은 잘 작동합니다 :

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

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


답변

이 시도

You_command 1>output.log  2>&1

&> x.file 사용법은 bash4에서 작동합니다. 그 죄송합니다 : (

몇 가지 추가 팁이 있습니다.

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

0은 stdin1 stdout, 2는 2를 나타냅니다 stderror. 3 ~ 9는 다른 임시 사용에 대비합니다.

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

사용법 : < file_descriptor > > < 파일 이름 | & file_descriptor >

http://www.tldp.org/LDP/abs/html/io-redirection.html을 참조 하십시오


답변

거의 10 년 동안 아무도이 접근법을 아직 게시하지 않은 것에 놀랐습니다.

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

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

이 방법은 서브 쉘을 생성하므로 기존의 접근 방식보다 효율성이 떨어 지므로 cmd >> file.txt 2>&1현재 쉘을 수정해야하는 명령 (예 🙂 cd에서는 작동하지 pushd않지만이 접근 방식은 더 자연스럽고 이해하기 쉽습니다.

  1. stderr를 stdout으로 리디렉션하십시오.
  2. 파일에 추가하여 새 stdout을 경로 재 지정하십시오.

또한 괄호는 특히 stdout 및 stderr을 다른 명령으로 파이프하려는 경우 순서의 모호성을 제거합니다.