프로그램은 STDOUT/STDERR 이외의 다른 위치로 어떻게 출력합니까? 그것을 피하는 방법?

프로그램은 STDOUT/STDERR 이외의 다른 위치로 어떻게 출력합니까? 그것을 피하는 방법?

분명히 사용 가능한 모든 출력 대상을 알지 못합니다. 나는 stdout( &1)와 stderr( &2)를 알고 있다. 그러나 두 설명자를 모두 리디렉션한 후 가끔아직내 콘솔에서 일부 출력을 얻으세요!

제가 생각할 수 있는 가장 간단한 예는 GNU Parallel입니다. 사용할 때마다 참조 알림이 표시됩니다. 이렇게 해도 &2>1 > file알림이 계속 표시됩니다.

동일하게 적용됩니다 emerge: 내가 실행하고 뭔가 잘못되면 일부 메시지는 인쇄되지 않습니다. stdout왜냐하면 stdin내가 그들을 리디렉션하고 있기 때문에 여전히 전달되기 때문입니다.

를 사용하여 이러한 문제를 대부분 해결했지만 script여전히 문제의 원인이 무엇인지 알고 싶습니다.

답변1

사용 중인 구문이 잘못되었습니다.

cmd &2>1 >file

으로 분할됩니다

cmd &
2>1 >file

이는 다음을 수행합니다.

  1. cmd리디렉션 없이 백그라운드 작업으로 실행
  2. 별도의 프로세스(명령 없음!)에서 stderr문자 그대로 호출된 파일로 리디렉션 1하고 다음 stdout으로 리디렉션합니다.file

원하는 구문은 다음과 같습니다.

cmd >file 2>&1

작업 순서가 중요합니다. 이는 다음을 수행합니다.

  1. 리디렉션stdoutfile
  2. 리디렉션 - 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 stdoutto /dev/null"를 수행한 다음 "stdout이 가리키는 위치로 stderr를 리디렉션"합니다(그래서 /dev/null). 환호!

그러나 여전히 문제가 있습니다. 프로그램이 로 인쇄됩니다 /dev/tty. 이제 이 동작을 수정하는 방법을 모르므로 을 수정해야 할 가능성이 높지만 script이 동작이 너무 자주 발생하지 않기를 바랍니다.

관련 정보