stderr에서 stdout으로 - 리디렉션 외에 다른 옵션이 있나요?

stderr에서 stdout으로 - 리디렉션 외에 다른 옵션이 있나요?

standard error...에 대한 나의 standard output지식은 매우 제한적입니다.

일반적인 방법 중 하나는 standard error로 리디렉션하는 것입니다. 이는 리디렉션 때문에 standard output오류(일반적으로 발생하는 오류)가 다시 나타나지 않는다는 의미입니까 ?standard errorstandard error

standard error이것이 사실이라면 복사 하고 복사본을 리디렉션하고 원본 콘텐츠를 standard output예상대로 리디렉션 할 수 있는 방법이 있습니까 ?standard error

답변1

제가 Unix를 처음 사용했을 때 누군가 파이프가 파이프처럼 작동한다고 설명했습니다.

프로세스에는 기본적으로 채우기를 위한 3개의 연결점이 있습니다.

           stdin
             |
          +--+--+
          | pgm |
          ++---++
           |   |
      stdout   stderr

그래서 이 작업을 수행하면 다음과 같은 cat | grep pattern결과를 얻게 됩니다.

         stdin
           |
        +--+--+
        | cat |
        ++---++
   stdout|   |stderr
         |   \
    stdin|    \
     +------+  |
     | grep |  |
     +-+---++  |
 stdout|   |   |
       |   \__ |
       |      \|
       |       |stderr

(당시는 전부 아스키 그래픽이었는데...)

표시된 대로 stderr를 stdout으로 리디렉션하면 pgm 2>&1그림은 다음과 같습니다.

    stdin |
          |
       +--+--+
       | pgm |
       ++---++
  stdout|   |stderr
        |   /
        |  /
        | /
        |/
        |

이론적으로는 이런 방식으로 많은 배관 작업을 수행할 수 있습니다. 예를 들어 awk '{print;print > "/dev/stderr"}'stdin을 stdout 및 stderr로 복사합니다.

그러나 매우 빠르게 혼란스러워질 수 있습니다. 자세한 내용은 bash 매뉴얼을 참조하세요.

노트:pgm = 위 그림의 프로그램입니다.

편집: 재미삼아 간단한 쉘 스크립트를 사용하여 좀 더 복잡한 파이핑을 시도해 보았습니다.

generate.sh:

echoerr() { echo "$@" 1>&2; }
for i in 1 2 3 4 5 6 ; do
        echo "STDOUT $i"
        echoerr "STDERR $i"
done

그리고 copytee.sh:

#!/bin/bash
echoerr() { echo "$@" 1>&2; }
while read line; do
        echo "stdout $line"
        echoerr "stderr $line"
done

(카피티 광고는 소문자, 생성은 대문자임을 참고하세요)

고급 형태의 리디렉션을 얻으려면 bash generate.sh 2> >(bash copytee.sh )다음과 같이 출력하십시오.

STDOUT 1
STDOUT 2
STDOUT 3
STDOUT 4
STDOUT 5
STDOUT 6
stdout STDERR 1
stderr STDERR 1
stdout STDERR 2
stderr STDERR 2
stdout STDERR 3
stderr STDERR 3
stdout STDERR 4
stderr STDERR 4
stdout STDERR 5
stderr STDERR 5
stdout STDERR 6
stderr STDERR 6

이것이 바로 당신이 요청한 것입니다.

답변2

"표준 오류"는 특별히 정의된 장소가 아닙니다. "표준 오류"는 파일 설명자 2에 추가되는 모든 것입니다.

"표준 오류"를 "표준 출력"으로 리디렉션하는 경우 파일 설명자 2를 닫은 다음 파일 설명자 1의 복사본으로 다시 열면 해당 파일 설명자 1에 정확히 해당 순간의 모든 위치에 첨부됩니다. 원본 파일 설명자 2가 손실됩니다(문자 그대로 파일 설명자가 닫힙니다). 그러므로 원하는 것을 정확히 할 수는 없습니다. "표준 오류"를 다른 곳으로 리디렉션하면 파일 설명자 2가 닫히고(그리고 리디렉션한 위치에 첨부하기 위해 다시 열리며) 위치 정보가 "있어야 하는" 위치에 대한 정보가 더 이상 없습니다.

관련 정보