명령 또는 쉘 스크립트의 출력이 stdout인지 stderr인지 확인하는 방법

명령 또는 쉘 스크립트의 출력이 stdout인지 stderr인지 확인하는 방법

명령이나 쉘 스크립트를 실행하면 출력이 나온다고 가정해 보겠습니다. 이 명령이나 셸 스크립트의 내부 내용에 대해 아무것도 모르는 상태에서 출력이 stderr또는 에서 나온 것인지 어떻게 확인할 수 있습니까 stdout?

예를 들어,

$ ls -ld /
drwxrwxr-t  35 root  admin  1258 Dec 11 19:16 /

비교됨

ls -ld /test
ls: /test: No such file or directory

stdout첫 번째 명령이 에 인쇄되고 두 번째 명령이 stderr(그렇습니까?) 에 인쇄되는지 어떻게 확인할 수 있습니까 ?

답변1

출력이 인쇄되었는지 여부를 알 수 있는 방법이 없습니다. 이 경우 stdout및 둘 다 stderr터미널에 연결되어 있으므로 텍스트가 터미널에 나타날 때까지 어떤 스트림에 기록되었는지에 대한 정보는 터미널에 도달하기 전에 프로그램에 의해 함께 조립됩니다.

위의 경우 명령을 실행 stdout하고 stderr다른 위치로 리디렉션하여 무슨 일이 일어나는지 확인할 수 있습니다. 또는 stdout리디렉션을 사용하여 한 번, 리디렉션을 /dev/null사용하여 한 번, 두 번 실행하고 어떤 경우에 텍스트가 표시되는지 확인하세요.stderr/dev/null

명령줄 끝에 추가하여 리디렉션할 수도 stdout있고, 추가하여 리디렉션할 수도 있습니다./dev/null>/dev/nullstderr/dev/null2>/dev/null

답변2

리디렉션 stdout 을 사용 > file하고 리디렉션 stderr 을 사용할 수 있습니다 2> file. 많은 최신 셸은 명령으로의 리디렉션을 지원하므로 sed이를 사용하여 어떤 출력이 어떤 스트림에서 나오는지 강조할 수 있습니다.

$ ls 2> >(sed 's/^/2: /') > >(sed 's/^/1: /')
1: unity_support_test.0
1: vmwareDnD

$ ls foo 2> >(sed 's/^/2: /') > >(sed 's/^/1: /')
2: ls: cannot access foo: No such file or directory

답변3

annotate-output데비안의 스크립트devscripts선택적으로 다음을 수행할 수 있습니다.

$ annotate-output ls -ld /test
14:54:22 -: Started ls -ld /test
14:54:22 E: ls: cannot access /test: No such file or directory
14:54:22 -: Finished with exitcode 2

두 번째 열은 각각 Ostdout과 stderr을 사용하고 나타냅니다 E.

몇 가지 주의 사항이 있는데, 가장 중요한 것은 다른 답변에 명시된 바와 같습니다. 사실 이후에는 이 작업을 수행할 수 없습니다. 쉘이나 터미널은 프로그램이 파일 디스크립터를 어떻게 사용하는지 알지 못하지만, 쉘은 처음에 파일 디스크립터를 설정해야 합니다.

이 방법은 fifo를 사용하고, fifo에 쓰는 것은 tty에 쓰는 것과 다르게 동작하며, 두 개의 다른 fifo에 쓰는 것은 확실히 다릅니다(잠재적인 타이밍/인터리빙 문제). 또한 대화식 사용에는 적합하지 않습니다. 예를 들어 이는 annotate-output bash그다지 좋은 계획은 아니지만 다른 많은 목적에는 유용합니다. stdin/stdout/stderr 색상 지정과 관련된 문제와 관련하여 스크립트 및 셸 함수의 예가 아주 많습니다. 가장 강력한 것은 다음과 같습니다.표준적인 미덕이는 프로그램의 (대부분) 런타임 수정을 사용하여 stderr에 기록된 데이터를 수정합니다.

Anko가 링크한 이 질문에는 관련 주제에 대한 좋은 답변이 있습니다: Colorizing stdout/stderr 출력: STDERR 및 STDOUT을 다른 색상으로 인쇄하도록 셸을 구성할 수 있나요?

답변4

일반적으로 STDERR은 메시지 앞에 프로그램 이름 앞에 콜론을 추가합니다.

예:

rpm -zq some_utils 
rpm: -zq: unknown option

VS

rpm -ql some_utils 
package some_utils is not installed

관련 정보