마지막 명령의 종료 코드를 처리하는 올바른 방법은 무엇입니까?

마지막 명령의 종료 코드를 처리하는 올바른 방법은 무엇입니까?

현재 POSIX 쉘 스크립트에서 이 작업을 수행하고 있습니다.

success=false

pv --wait "$input_filename" | openssl enc -aes-256-cbc -d -salt -out "$output_filename" && success=true

if [ "$success" = "true" ]
...

문제는 내가 이 일을 올바르게 하고 있는지 확신할 수 없다는 것입니다.

예를 들어, 저는 이 접근 방식이 단지 $?.

내가 왜 신경쓰나요?

글쎄, 왜냐면ShellCheck.net나에게 경고하다:

SC2181$?를 사용하여 간접적으로 확인하는 대신 "if mycmd;"를 사용하여 직접 종료 코드를 확인하세요.

답변1

명령이 성공했는지 확인해야 한다면 이 if command; then foo; else bar; fi방법을 사용하면 됩니다.

그러나 어떤 이유로 더 복잡한 오류 처리가 필요한 경우에는 확인된 값이 $?더 적절할 것입니다.

command
case $? in
  0) foo ;;
  1) bar ;;
  2) baz ;;
  *) something_else ;;
esac

답변2

게시한 링크를 기준으로 보면 다음과 같습니다.

if pv --wait "$input_filename" | openssl enc -aes-256-cbc -d -salt -out "$output_filename"; then
        code for true
else
        code for false
fi

내 테스트에서 이것은 상대방의 상태에 따라 파이프에 문제가 될 수 있습니다. openssl을 사용하면 괜찮을 것이라고 생각하지만, cat또는 같은 것으로 파이프하면 echo항상 성공적인 것으로 간주될 것이라고 생각합니다. 파이프라인의 마지막 명령이 성공적으로 종료됩니다.

성공 또는 실패 시 실행되는 명령이 하나만 있는 경우 다음과 같은 것도 작동할 수 있습니다.

command && code for success 

또는

command || code for failure

관련 정보