성공하면 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

같은 방법으로 위 예의 절 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

관련 정보