处理最后一个命令的退出代码的正确方法是什么?

处理最后一个命令的退出代码的正确方法是什么?

我目前正在 POSIX shell 脚本中执行此操作:

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 你应该没问题,但如果你通过管道传输到类似catecho我相信它总是会被视为成功,因为管道中的最后一个命令将成功退出。

如果您只有一个在成功或失败时执行的命令,类似这样的命令也可能有效:

command && code for success 

或者

command || code for failure

相关内容