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


1533

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

cmd > file.txt

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

cmd >> file.txt

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

cmd &> file.txt

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


37
&> outfile은 Bash (및 기타) 특정 코드이며 이식 가능하지 않습니다. 휴대용으로가는 방법은 (첨부 답변과 유사) 항상 있었고 여전히> outfile 2> & 1
TheBonsai

답변:


1997
cmd >>file.txt 2>&1

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

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

33
잘 작동합니다! 그러나 이것을 이해할 수있는 방법이 있습니까? 아니면 이것을 원자 bash 구조처럼 취급해야합니까?
flybywire 08 년

181
리디렉션은 간단합니다. 리디렉션 문은 항상 왼쪽에서 오른쪽으로 평가됩니다. >> 파일 : 빨간색. 파일로 STDOUT (추가 모드) (1 >> 파일의 줄임) 2> & 1 : 빨간색. STDERR을 "stdout으로 이동"으로 해석 "STDERR을 STDOUT으로 경로 재 지정"해석이 잘못되었습니다.
TheBonsai

31
"출력 (stdout, 파일 디스크립터 1)을 file.txt에 추가하고 stderr (파일 디스크립터 2)를 fd1과 같은 위치에 보냅니다"라고 표시되어 있습니다.
추후 공지가있을 때까지 일시 중지되었습니다.

2
@TheBonsai 그러나 STDERR을 다른 파일로 리디렉션하고 추가 해야하는 경우 어떻게해야합니까? 이것이 가능한가?
arod

41
그렇게 cmd >>file1 2>>file2하면 원하는 것을 달성해야합니다.
Woodrow Douglass

367

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


8
&> 및 >>와 일치하므로 & >>를 선호합니다. 또한 '출력에 오류 보내기,이 파일에 출력 추가'보다 '이 파일에 출력 및 오류 추가'를 읽는 것이 더 쉽습니다. 리눅스는 일반적으로 현재 버전의 bash, OS X를 가지고 있지만 홈 브루 등을 통해 수동으로 설치하려면 여전히 bash 4가 필요합니다.
mikemaccana

더 짧고 한 줄에 두 자리 만 있기 때문에 더 좋아합니다. 예를 들어 zsh는 "& >>"로 무엇을 만들까요?
Phillipp

또한 크론 작업에서는 시스템에 Bash 4가 있더라도 pre-4 구문을 사용해야합니다.
hyperknot

5
@zsero cron은 bash를 전혀 사용하지 않습니다 ... 사용합니다 sh. 당신은 앞에 추가하여 기본 쉘을 변경할 수 있습니다 SHELL=/bin/bash받는 crontab -e파일.
Ray Foss 2016 년

89

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

cmd >log.out 2>log_error.out

추가는 다음과 같습니다.

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

6
첫 번째 옵션을 사용하여 두 개의 스트림을 동일한 파일로 리디렉션하면 첫 번째 스트림이 두 번째 스트림의 "맨 위에"쓰여지고 일부 또는 모든 내용을 덮어 씁니다. 대신 cmd >> log.out 2> log.out을 사용하십시오.
Orestis P.

3
그것을 잡아 주셔서 감사합니다; 당신 말이 맞아, 하나는 다른 하나를 방해 할 것이다. 그러나 명령도 작동하지 않습니다. 나는 같은 파일에 쓰는 유일한 방법은 이전에 주어진 것 같아요 cmd >log.out 2>&1. 첫 번째 예를 제거하기 위해 답변을 편집하고 있습니다.
Aaron R.

65

Bash 4 (ZSH 4.3.11)에서 :

cmd &>>outfile

상자에서 바로


2
@all : 이것은 bash와 함께 작동하고 간단하기 때문에 좋은 대답입니다. 따라서 bash를 명시 적으로 언급하도록 편집했습니다.
mikemaccana

10
@mikemaccana : TheBonsai의 응답 쇼 2009 4 솔루션을 강타
JFS

52

이것은 잘 작동합니다 :

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

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


터미널에서도 출력을보고자한다면 정답입니다. 그러나 이것은 원래 묻는 질문이 아닙니다.
Mikko Rantalainen

25

이 시도

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을 참조 하십시오


귀하의 예제는 요청한 OP와 다른 작업을 수행합니다. stderr You_command을 stdout으로 리디렉션 하고 stdout을 You_command파일로 리디렉션 합니다 output.log. 또한 파일에 추가되지 않지만 파일을 덮어 씁니다.
pabouk

올바른 : 파일 디스크립터 는 다른 모든 파일에 대해 3보다 큰 값일 수 있습니다.
Itachi

5
귀하의 답변은 가장 일반적인 출력 리디렉션 오류를 나타냅니다. STDERR이 동일한 파일로 경로 재 지정되지는 않습니다. 리디렉션 순서가 중요합니다.
Jan Wikholm

1
그것은 먼저 STDERROR를 STDOUT으로 리디렉션 한 다음 STDOUT을 파일로 리디렉션해야한다는 것을 의미합니다. 1 > output.log 2>&1
Quintus. Zhou

1
@ Quintus.Zhou Yup. 버전이 err을 아웃으로 리디렉션하고 동시에 파일을 아웃 아웃합니다.
Alex Yaroshevich

11

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

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

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

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

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

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


이 구현은 시스템을위한 하나의 추가 프로세스를 실행시킵니다. 구문 사용 cmd >> file 2>&1은 모든 쉘에서 작동하며 추가 프로세스가 필요하지 않습니다.
Mikko Rantalainen

@MikkoRantalainen 나는 이미 서브 쉘을 생성하고 덜 효율적이라고 설명했습니다. 이 방법의 요점은 효율성이 크게 중요하지 않은 경우 (그리고 거의 그렇지 않은 경우),이 방법은 기억하기 쉽고 잘못되기가 더 어렵다는 것입니다.
jamesdlin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.