성공하면 stdout을 command-A로 리디렉션하고, 그렇지 않으면 stderr을 command-b로 리디렉션합니다. 또한 임시 파일을 사용하지 마십시오

성공하면 stdout을 command-A로 리디렉션하고, 그렇지 않으면 stderr을 command-b로 리디렉션합니다. 또한 임시 파일을 사용하지 마십시오

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

stdoutelse명령 대체가 성공하면( 위 예의 절 에서 발생 ) 동일한 방법을 사용하여 이를 캡처할 수 있습니다. 두 경우 모두 내용을 조작하면 "$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

관련 정보