![성공하면 stdout을 command-A로 리디렉션하고 그렇지 않으면 stderr을 command-b로 리디렉션합니다. 임시 파일 사용을 피하면서](https://rvso.com/image/164722/%EC%84%B1%EA%B3%B5%ED%95%98%EB%A9%B4%20stdout%EC%9D%84%20command-A%EB%A1%9C%20%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98%ED%95%98%EA%B3%A0%20%EA%B7%B8%EB%A0%87%EC%A7%80%20%EC%95%8A%EC%9C%BC%EB%A9%B4%20stderr%EC%9D%84%20command-b%EB%A1%9C%20%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98%ED%95%A9%EB%8B%88%EB%8B%A4.%20%EC%9E%84%EC%8B%9C%20%ED%8C%8C%EC%9D%BC%20%EC%82%AC%EC%9A%A9%EC%9D%84%20%ED%94%BC%ED%95%98%EB%A9%B4%EC%84%9C.png)
만족스러울 때는 stdout에 기록하고 그렇지 않을 때는 stderr에 기록하는 명령이 있습니다. 명령의 종료 상태를 확인하고 stdout 또는 stderr로 작업을 수행하고 싶습니다.
if ! command >/tmp/stdout 2>/tmp/stderr; then
// do something with /tmp/stderr
exit 1
fi
// do something else with /tmp/stdout
두 개가 아닌 하나의 파일만 갖는 것이 확실히 가능하지만 하나가 아닌 모든 파일을 제거하고 싶습니다.
임시 파일을 방지하는 방법이 있나요? mkfifo 및 사용자 정의 파일 설명자를 사용해 보았지만 작동하지 않습니다.
답변1
$(..)
조건 에서 명령 대체 구문을 사용하여 if
명령이 성공적으로 실행되었는지 확인하고 명령 결과를 변수에 stdout
모두 저장할 수 있습니다.stderr
if ! var=$(cmd 2>&1); then
printf 'process stderr contents from $var'
fi
cmd
이 작업을 수행하는 간단한 스크립트로 실행되도록 시뮬레이션하면 작동하는 것을 볼 수 있습니다.
# cat temp.sh
echo foo >&2
exit 1
그리고 스크립트를 다음과 같이 실행하면
if ! var=$(bash tmp.sh 2>&1); then
printf '%s\n' 'process stderr contents from $var'
printf '%s\n' "$var"
fi
같은 방법으로 위 예의 절 stdout
에 있는 명령 대체가 성공한 경우 캡처 작업을 수행할 수 있습니다 . else
두 경우 모두 의 내용을 조작하면 "$var"
(따옴표가 있는지 확인) 결과가 파일에 저장된 것처럼 처리됩니다.
더 나아가서 명령 대체 구문을 인용할 수 있습니다.~ 아니다쉘이 결과에 대해 단어 분할을 수행하도록 하십시오. 예를 들어 아래와 같이 하면 됩니다. 여기에 표시된 것과 같은 간단한 경우에는 필요하지 않을 수 있지만 결과에 특수 쉘 메타 문자가 포함된 경우에는 필요하지 않습니다.
if ! var="$(bash tmp.sh 2>&1)"; then
참고: 답변의 첫 번째 버전이 게시된 이후 질문 제목이 다시 표현되었습니다.
답변2
아래 코드를 사용할 수 있습니다
if [[ $? == 0 ]]
then
command 1>stdout.txt
else
echo "exit code is not successfull"
command 2> stderr.txt
fi