일부 Linux 프로그램의 출력이 STDOUT도 STDERR도 아닌 이유는 무엇입니까?
실제로, 사용하는 '스트림'에 관계없이 모든 프로그램 출력을 안정적으로 캡처하는 방법을 알고 싶습니다. 내가 가진 문제는 일부 프로그램이 출력을 캡처하지 못하는 것입니다.
예를 들어 'time'명령이 있습니다.
time sleep 1 2>&1 > /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
또는
time sleep 1 &> /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
두 번 출력되는 이유는 무엇입니까? 나는 모든 것이 / dev / null 로 파이프 될 것으로 예상했다 .
시간을 사용하는 출력 스트림은 무엇이며 어떻게 파일로 파이프 할 수 있습니까?
이 문제를 해결하는 한 가지 방법은 다음 명령을 포함 하여 Bash 스크립트 를 작성하는 것입니다 combine.sh
.
$@ 2>&1
그런 다음 '시간'의 출력을 올바른 방식으로 캡처 할 수 있습니다.
combine.sh time sleep 1 &> /dev/null
(출력이 보이지 않음-올바른)
별도의 결합 스크립트를 사용하지 않고 원하는 것을 달성 할 수있는 방법이 있습니까?
2>&1 > /dev/null
2 지금 (기본적으로, 즉, 단자) (1)이가는 곳으로 간다 "의미하고 1은 현재 진행을을 / dev / null (하지만이 여전히 터미널로 간다!)를 사용합니다.>/dev/null 2>&1
말을 "1은 이제 / dev / null로 갔다가 2는 1이가는 곳으로갑니다 (즉, / dev / null로갑니다). 내장 '시간'이 리디렉션되지 않기 때문에 여전히 여기에서 작동하지 않지만 더 일반적으로 정확합니다 (예 : / usr / bin / time을 사용하는 경우 작동 함). "2> & 1"은 2가 1이 아닌 2로 1의 "방향"을 복사하는 것으로 생각하십시오