많은 명령을 한 번에 리디렉션하는 솔루션은 다음과 같습니다.
#!/bin/bash
{
somecommand
somecommand2
somecommand3
} 2>&1 | tee -a $DEBUGLOG
원래 솔루션이 작동하지 않는 이유 : exec 2> & 1은 표준 오류 출력을 쉘의 표준 출력으로 리디렉션합니다. 콘솔에서 스크립트를 실행하면 콘솔이됩니다. 명령의 파이프 리디렉션은 명령의 표준 출력 만 리디렉션합니다.
의 관점에서 somecommand
, 표준 출력은 연결된 파이프 tee
로 들어가고 표준 오류는 쉘의 표준 오류와 동일한 파일 / 의사 파일로 들어갑니다. 이것은 쉘의 표준 출력으로 리디렉션됩니다. 콘솔에서 프로그램을 실행하는 경우 콘솔.
그것을 설명하는 한 가지 진정한 방법은 실제로 무슨 일이 일어나는지 보는 것입니다.
터미널에서 쉘을 실행하면 쉘의 원래 환경은 다음과 같습니다.
stdin -> /dev/pts/42
stdout -> /dev/pts/42
stderr -> /dev/pts/42
표준 오류를 표준 출력 ( exec 2>&1
) 으로 리디렉션 하면 기본적으로 아무것도 변경되지 않습니다. 그러나 스크립트의 표준 출력을 파일로 리디렉션하면 다음과 같은 환경이 생깁니다.
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /dev/pts/42
그런 다음 쉘 표준 오류를 표준 출력으로 리디렉션하면 다음과 같이 끝납니다.
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /your/file
명령을 실행하면이 환경이 상속됩니다. 명령을 실행하여 티에 파이프하면 명령 환경은 다음과 같습니다.
stdin -> /dev/pts/42
stdout -> pipe:[4242]
stderr -> /your/file
따라서 명령의 표준 오류는 여전히 셸이 표준 오류로 사용하는 방식으로 진행됩니다.
실제로 심볼 링크의 내용을 나열하는 데 /proc/[pid]/fd
사용 ls -l
하여 명령의 환경을 볼 수 있습니다 . 0
여기 의 파일은 표준 입력이고 1
표준 출력이며 2
표준 오류입니다. 명령이 더 많은 파일을 열면 (대부분의 프로그램에서) 파일도 볼 수 있습니다. 프로그램은 또한 표준 입력 / 출력 및 재사용을 재 또는 종료를 선택할 수 0
, 1
및 2
.
|&
대한 바로 가기로 작동2>&1 |
하며 적어도 약간 더 편리합니다.