스크립트에서 같은 줄의 stderr 및 stdout을 다른 파일로 리디렉션하는 방법은 무엇입니까?


180

나는 이것을 많이 알고있다 :

$ command 2>> error

$ command 1>> output

stderr을 오류 파일로 출력하고 stdout을 동일한 bash 행의 출력 파일로 출력 할 수있는 방법이 있습니까?

답변:


292

한 줄에 추가하면됩니다. command 2>> error 1>> output

그러나 >>파일에 이미 데이터가있는 경우 추가하기위한 것입니다. 반면 >파일의 기존 데이터를 덮어 씁니다.

따라서 command 2> error 1> output추가하지 않으려는 경우.

완료를 위해 기본 파일 디스크립터가 출력 인 1>것처럼 작성할 수 있습니다 >. 지금 1>>같은 일이다.

따라서 command 2> error 1> output,이된다command 2> error > output


3
좋은 답변입니다! 나는 어떻게 1>쓸 수 있는지에 대한 당신의 설명을 정말로 좋아합니다>
user784637

이 것과 어떻게 다른가 command &2>err.log, 나는 완전히 혼란스러워하는 세금이라고 생각합니다. (모든 배쉬 파이프의 적절한 답변에 대한 링크가 순서대로있을 수 있습니다)
ThorSummoner

4
@ThorSummoner tldp.org/LDP/abs/html/io-redirection.html 은 내가 생각하는 것입니다. Fwiw command &2>err.log는 합법적이지 않은 것처럼 보입니다. 구문의 앰퍼샌드는 파일 설명자를 대상으로 사용합니다. 예를 들어 command 1>&2stdout을 stderr로 다시 라우팅합니다.
DreadPirateShawn

@DreadPirateShawn, ABS를 참조로 연결하지 마십시오. 때로는 부정확 한 내용이 부정확하고 잘못된 사례가 포함되어 있습니다. wiki.bash-hackers.org/howto/redirection_tutorial 은 리디렉션에 대한 훨씬 좋은 참조 소스입니다.
Charles Duffy

27

이 시도:

your_command 2>stderr.log 1>stdout.log

추가 정보

도면 부호 0를 통해이 9있는 파일 기술자 bash는있다. 0표준 입력, 1표준 출력, 2표준 오류를 나타냅니다. 3통과 9는 다른 임시 사용을위한 여분입니다.

모든 파일 디스크립터는 연산자를 사용하여 파일 또는 다른 파일 디스크립터로 경로 재 지정 될 수 있습니다 >. 대신 연산자 >>를 사용하여 빈 파일을 작성하는 대신 파일에 추가 할 수 있습니다 .

용법:

file_descriptor > filename

file_descriptor > &file_descriptor

을 참조하시기 바랍니다 고급 Bash 스크립팅 가이드 : 제 20 장 I / O 리디렉션 .




9

또는 하나의 단일 파일에 출력 (stdout & stderr)을 혼합하려면 다음을 사용하십시오.

command > merged-output.txt 2>&1

32
이것은 질문에 대한 답변이 아닙니다.
Matthias

사람들이 출력을 병합하거나 출력 병합을 제안하는 이유는 무엇입니까?
nurettin

@ nurettin : 아마도 명령을 실행하고 출력을 로그 파일에 즉시 저장하는 스크립트 줄이있을 수 있습니다. 문제의 명령이 때때로 실패 할 수 있으므로 해당 오류는 물론 동일한 로그 파일에 저장하려고합니다.
streamofstars 19

@streamofstars 네 물론 그렇습니다. 때로는 사람들이 원하는 것입니다.이 질문의 맥락에서 답을 찾고있는 사람으로 댓글을 달고 있고 많은 사람들이 스택 오버 플로우에서 발견했습니다.
nurettin

0

여러 명령의 출력을 리디렉션 할 수 있습니다. 이것은 명령 행 또는 bash 스크립트에서 가장 유용합니다. 는 -s화면에 프롬프트 비밀번호를 지시합니다.

Hereblock cmds stdout / stderr은 별도의 파일로 보내지고 표시 할 내용이 없습니다.

sudo -s -u username <<'EOF' 2>err 1>out
ls; pwd;
EOF

Hereblock cmds stdout / stderr은 단일 파일로 전송되어 표시됩니다.

sudo -s -u username <<'EOF' 2>&1 | tee out
ls; pwd;
EOF

Hereblock cmds stdout / stderr은 별도의 파일로 보내지고 stdout은 표시됩니다.

sudo -s -u username <<'EOF' 2>err | tee out
ls; pwd;
EOF

사용자 (whoami) 및 사용자 이름에 따라 비밀번호가 필요하거나 필요하지 않을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.