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
단일 행 변수로 사용하고 stderr
1행인지(또는 평면화) 상관하지 않는다고 가정하여 몇 가지 가정을 해보겠습니다. 그런 다음 간단한 스크립트로 테스트해 보겠습니다. 여기서 "2"는 stderr
stdout으로 이동하고 다른 줄은 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 줄 바꿈을 포함하거나 파일을 다시 사용하여 돌아갈 수 있습니다.