![마지막 명령의 종료 코드를 처리하는 올바른 방법은 무엇입니까?](https://linux55.com/image/123420/%EB%A7%88%EC%A7%80%EB%A7%89%20%EB%AA%85%EB%A0%B9%EC%9D%98%20%EC%A2%85%EB%A3%8C%20%EC%BD%94%EB%93%9C%EB%A5%BC%20%EC%B2%98%EB%A6%AC%ED%95%98%EB%8A%94%20%EC%98%AC%EB%B0%94%EB%A5%B8%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
현재 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