분명히 사용 가능한 모든 출력 대상을 모릅니다. stdout
( &1
) 및 stderr
( &2
) 에 대해 알고 있습니다. 그러나 두 디스크립터를 리디렉션 한 후에도 때때로 콘솔에 출력이 표시되는 경우가 있습니다 !
내가 생각할 수있는 가장 쉬운 예는 GNU Parallel입니다. 사용할 때마다 인용 알림이 표시됩니다. 내가 할 때에도 &2>1 > file
여전히 통지를 볼 수 있습니다.
그리고 같은이 적용 emerge
I이 등장 실행하고 몇 가지 문제가있을 경우, 어떤 정보가 인쇄되지 않습니다 : stdout
도 stdin
, 내가 그들을 리디렉션 이후 그들은 여전히 통과.
나는 주로을 사용하여 이러한 문제를 해결 script
하지만 여전히이 문제의 원인이 무엇인지 궁금합니다.
답변
사용한 구문이 잘못되었습니다.
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
동일한 작업을 수행합니다.
답변
두 가지 문제가 있습니다.
첫 번째는 순서가 중요하고 두 번째는 /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
곳 stdout
(콘솔 출력)으로 리디렉션”을 얻습니다 . 그런 다음 “리디렉션 stdout
을 /dev/null
받습니다. 다음 과 같은 상황이 발생합니다.
stdout
-> /dev/null
stderr
-> 콘솔
그래서 우리는 그것을 올바르게 얻습니다.
./testmyscript.sh >/dev/null 2>&1
그리고 우리는 :
ttdada
.
이제 우리는 “리디렉션을 수행 stdout
하는 /dev/null
다음”및 “표준 출력이 가리키는 곳으로 리디렉션 표준 오류”(지금을 /dev/null
). 만세!
그러나 여전히 문제가 있습니다. 프로그램이로 인쇄됩니다 /dev/tty
. 이제 나는 이런 종류의 행동을 고치는 법을 모른다. 그래서 당신은 아마도 필요할 것 script
같지만, 이런 행동이 너무 자주 일어나지 않기를 바란다.