프로그램이 STDOUT / STDERR 이외의 다른 곳으로 어떻게 출력됩니까? 그것을 피하는 방법? 할 때에도 &2>1 >

분명히 사용 가능한 모든 출력 대상을 모릅니다. stdout( &1) 및 stderr( &2) 에 대해 알고 있습니다. 그러나 두 디스크립터를 리디렉션 한 후에도 때때로 콘솔에 출력이 표시되는 경우가 있습니다 !

내가 생각할 수있는 가장 쉬운 예는 GNU Parallel입니다. 사용할 때마다 인용 알림이 표시됩니다. 내가 할 때에도 &2>1 > file여전히 통지를 볼 수 있습니다.

그리고 같은이 적용 emergeI이 등장 실행하고 몇 가지 문제가있을 경우, 어떤 정보가 인쇄되지 않습니다 : stdoutstdin, 내가 그들을 리디렉션 이후 그들은 여전히 통과.

나는 주로을 사용하여 이러한 문제를 해결 script하지만 여전히이 문제의 원인이 무엇인지 궁금합니다.



답변

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

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

결과는 stderrstdout로 리디렉션됩니다 file.

에서 bash, 더 간단한 비표준 (따라서 이식성 측면에서 권장하지 않음) 구문은 cmd &> file동일한 작업을 수행합니다.


답변

두 가지 문제가 있습니다.

첫 번째는 순서가 중요하고 두 번째는 /dev/tty입니다.

이 스크립트를 다음에서 출력을 캡처하려는 예제 스크립트로 사용하십시오.

test.sh:

#!/bin/bash

echo dada
echo edada 1>&2
echo ttdada >/dev/tty

이제 명령의 출력을 보자.

./testmyscript.sh 2>&1 >/dev/null:

edada
ttdada

평가 순서는 왼쪽에서 오른쪽이므로 먼저 ” 출력하는 stderrstdout(콘솔 출력)으로 리디렉션”을 얻습니다 . 그런 다음 “리디렉션 stdout/dev/null받습니다. 다음 과 같은 상황이 발생합니다.

stdout-> /dev/null
stderr-> 콘솔

그래서 우리는 그것을 올바르게 얻습니다.

./testmyscript.sh >/dev/null 2>&1

그리고 우리는 :

ttdada.

이제 우리는 “리디렉션을 수행 stdout하는 /dev/null다음”및 “표준 출력이 가리키는 곳으로 리디렉션 표준 오류”(지금을 /dev/null). 만세!

그러나 여전히 문제가 있습니다. 프로그램이로 인쇄됩니다 /dev/tty. 이제 나는 이런 종류의 행동을 고치는 법을 모른다. 그래서 당신은 아마도 필요할 것 script같지만, 이런 행동이 너무 자주 일어나지 않기를 바란다.