![프로그램은 STDOUT/STDERR 이외의 다른 위치로 어떻게 출력합니까? 그것을 피하는 방법?](https://linux55.com/image/90545/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%80%20STDOUT%2FSTDERR%20%EC%9D%B4%EC%99%B8%EC%9D%98%20%EB%8B%A4%EB%A5%B8%20%EC%9C%84%EC%B9%98%EB%A1%9C%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%B6%9C%EB%A0%A5%ED%95%A9%EB%8B%88%EA%B9%8C%3F%20%EA%B7%B8%EA%B2%83%EC%9D%84%20%ED%94%BC%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%3F.png)
분명히 사용 가능한 모든 출력 대상을 알지 못합니다. 나는 stdout
( &1
)와 stderr
( &2
)를 알고 있다. 그러나 두 설명자를 모두 리디렉션한 후 가끔아직내 콘솔에서 일부 출력을 얻으세요!
제가 생각할 수 있는 가장 간단한 예는 GNU Parallel입니다. 사용할 때마다 참조 알림이 표시됩니다. 이렇게 해도 &2>1 > file
알림이 계속 표시됩니다.
동일하게 적용됩니다 emerge
: 내가 실행하고 뭔가 잘못되면 일부 메시지는 인쇄되지 않습니다. stdout
왜냐하면 stdin
내가 그들을 리디렉션하고 있기 때문에 여전히 전달되기 때문입니다.
를 사용하여 이러한 문제를 대부분 해결했지만 script
여전히 문제의 원인이 무엇인지 알고 싶습니다.
답변1
사용 중인 구문이 잘못되었습니다.
cmd &2>1 >file
으로 분할됩니다
cmd &
2>1 >file
이는 다음을 수행합니다.
cmd
리디렉션 없이 백그라운드 작업으로 실행- 별도의 프로세스(명령 없음!)에서
stderr
문자 그대로 호출된 파일로 리디렉션1
하고 다음stdout
으로 리디렉션합니다.file
원하는 구문은 다음과 같습니다.
cmd >file 2>&1
작업 순서가 중요합니다. 이는 다음을 수행합니다.
- 리디렉션
stdout
file
- 리디렉션 -
stderr
즉&1
, 동일한 파일 핸들stdout
결과적으로 stderr
및 둘 다 stdout
로 리디렉션됩니다 file
.
에서는 bash
더 간단한 비표준 구문(이식성 이유로 권장하지 않음)도 cmd &> file
동일한 작업을 수행합니다.
답변2
두 가지 질문이 있습니다.
첫 번째는 순서가 중요하다는 것이고, 두 번째는 /dev/tty
.
출력을 캡처하려는 예제 스크립트로 이 스크립트를 사용하겠습니다.
test.sh
:
#!/bin/bash
echo dada
echo edada 1>&2
echo ttdada >/dev/tty
이제 명령의 출력을 살펴보겠습니다.
./testmyscript.sh 2>&1 >/dev/null
:
edada
ttdada
평가 순서는 왼쪽에서 오른쪽이므로 먼저 " 출력이 출력되는 위치(즉, 콘솔 출력) stderr
로 리디렉션"을 얻습니다. 그런 다음 "redirect to"를 stdout
얻습니다 . 우리는 다음과 같은 상황으로 끝납니다.stdout
/dev/null
stdout
-> /dev/null
stderr
-> 콘솔
따라서 올바른 결과를 얻습니다.
./testmyscript.sh >/dev/null 2>&1
우리는 다음을 얻었습니다:
ttdada
.
이제 우리는 "redirect stdout
to /dev/null
"를 수행한 다음 "stdout이 가리키는 위치로 stderr를 리디렉션"합니다(그래서 /dev/null
). 환호!
그러나 여전히 문제가 있습니다. 프로그램이 로 인쇄됩니다 /dev/tty
. 이제 이 동작을 수정하는 방법을 모르므로 을 수정해야 할 가능성이 높지만 script
이 동작이 너무 자주 발생하지 않기를 바랍니다.