정상적으로 실행되면 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