고쳐 쓰다

고쳐 쓰다

stdout내 스크립트에는 및 에 대한 출력을 생성하는 복잡한 명령이 있습니다 stderr. 두 가지를 별도의 변수로 캡처해야 합니다.

#!/bin/sh
A=$(command)

stderr변수로 "캡처"하는 방법은 무엇입니까 B?

and의 몇 가지 변형을 시도했지만 작동하지 않습니다 2>&1.read

A=$(some_command) 2>&1 | read B
echo $B

또는

{ OUT="$(command)" 2>&1 | read B ; }
echo $B

작동하는 유일한 방법은 stderr임시 파일로 리디렉션하여 다시 읽는 것입니다. 그러나 이것은 더러운 해킹처럼 보입니다. 임시 파일을 사용하지 않고 이를 수행할 수 있는 방법이 있습니까?

고쳐 쓰다

명확히 하기 위해 stdout및 둘 다 stderr여러 줄로 출력됩니다.

답변1

솔직히 파일을 사용하는 것이 아마도 가장 쉬운 방법일 것입니다. 그러나 여기서는 stdout단일 행 변수로 사용하고 stderr1행인지(또는 평면화) 상관하지 않는다고 가정하여 몇 가지 가정을 해보겠습니다. 그런 다음 간단한 스크립트로 테스트해 보겠습니다. 여기서 "2"는 stderrstdout으로 이동하고 다른 줄은 stdout으로 이동합니다.

> cat outerr.sh
echo 1
echo 2 >&2
echo 3
> ./outerr.sh
1
2
3
> ./outerr.sh 2>/dev/null
1
3

그러면 다음과 같이 할 수 있습니다:

(echo $(./outerr.sh) # Collect and flatten the stdout output 
                     # Meanwhile stderr flows through the pipe
) 2>&1|{
        read err     # This assumes stderr is one line only
        read out
        echo "err=$err"
        echo "out=$out"
}

또는 stderr이 여러 줄일 수 있다면

(echo $(./outerr.sh) # Collect and flatten the stdout output 
                     # Meanwhile stderr flows through the pipe
) 2>&1|tac|{         # reverse the output so the stdout line comes first
        read out
        err=$(tac)   # reverse lines again, back to the original line order
        echo "err=$err"
        echo "out=$out"
}

출력 포함

err=2
out=1 3

줄을 유지해야 하는 경우 stdout\n 줄 바꿈을 포함하거나 파일을 다시 사용하여 돌아갈 수 있습니다.

관련 정보