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

Lin*_*eak 3 shell-script posix exit-status

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

success=false

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

if [ "$success" = "true" ]
...
Run Code Online (Sandbox Code Playgroud)

问题是,我不太确定,如果我这样做正确。

例如,我不明白那种方法和只是检查$?.

我为什么在乎?

好吧,因为ShellCheck.net警告过我:

SC2181直接使用例如“if mycmd;”检查退出代码,而不是间接使用 $?。

nxn*_*nev 7

如果您只需要检查命令是否成功,if command; then foo; else bar; fi应该可以满足您的需求。

但是如果由于某种原因你需要做更复杂的错误处理,检查的值$?会更合适:

command
case $? in
  0) foo ;;
  1) bar ;;
  2) baz ;;
  *) something_else ;;
esac
Run Code Online (Sandbox Code Playgroud)


jes*_*e_b 5

根据您发布的链接,它应该是这样的:

if pv --wait "$input_filename" | openssl enc -aes-256-cbc -d -salt -out "$output_filename"; then
        code for true
else
        code for false
fi
Run Code Online (Sandbox Code Playgroud)

在我的测试中,这可能是管道的问题,具体取决于您另一端的内容……我认为使用 openssl 应该没问题,但是如果您正在使用类似的管道,cat或者echo我相信它总是会被视为成功,因为管道中的最后一个命令将成功退出。

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

command && code for success 
Run Code Online (Sandbox Code Playgroud)

或者

command || code for failure
Run Code Online (Sandbox Code Playgroud)