shell脚本中特定exit_code的异常处理?

pzfprimi  于 2023-11-21  发布在  Shell
关注(0)|答案(7)|浏览(227)

我明白

  1. a_command || fallback_command

字符串
它会从command_a中捕获任何非零的exit_code(即当command_a失败时),并运行fallback_commad。如何为某些特定代码实现这一点?如何使它像a_command抛出255时那样工作,然后运行fallback_command?
我试着做一些事情,

  1. a_command
  2. VAR=$?
  3. if [ $VAR==255 ]
  4. then
  5. fallback_command
  6. exit 0
  7. fi


但是这不会抑制由command_a抛出的非零错误。我想抑制非零的exit_codes。

mm5n2pyu

mm5n2pyu1#

IMHO case是完美的这一点

  1. a_command
  2. VAR=$?
  3. case $VAR in
  4. 255) fallback_command ;;
  5. 123) fallback_command2;;
  6. ...) ... ;;
  7. 0) exit 0;;
  8. esac

字符串

k4ymrczo

k4ymrczo2#

就像这样简单地维护内联布尔或||

  1. a_command || [ $? -ne 255 ] || fallback_command

字符串
测试实现:

  1. #!/usr/bin/env bash
  2. a_command_success(){ echo 'running a_command_success';}
  3. a_command_failing_42(){ echo 'running a_command_failing_42'; return 42;}
  4. a_command_failing_255(){ echo 'running a_command_failing_255'; return 255;}
  5. fallback_command(){ echo 'running fallback_command';}
  6. for a_command in a_command_success a_command_failing_255 a_command_failing_42
  7. do "$a_command" || [ $? -ne 255 ] || fallback_command; done


测试输出:

  1. running a_command_success
  2. running a_command_failing_255
  3. running fallback_command
  4. running a_command_failing_42


进一步使用fall_back caller实用程序命令:

  1. # When return code equals argument 1, execute command and arguments 2+
  2. # Example:
  3. # a_command || falllback_rc 255 fallback_command arg1 arg2 ... argn
  4. fallback_rc(){ [ "$?" -eq "$1" ]&&{ shift;"$@";}}

展开查看全部
wbrvyc0a

wbrvyc0a3#

您的代码中有一个错误。[ $VAR==255 ]将始终为真,因为它与下面的代码相同:

  1. [ string ]
  2. Returns true if string is not empty.

字符串
如果要比较数字,请使用-eq

  1. if [ $VAR -eq 255 ]


同样,若要测试字串的相等性,您可以用途:

  1. if [ $VAR = 255 ]


在本例中,您希望使用-eq
此页面可以帮助:https://www.computerhope.com/unix/bash/test.htm

展开查看全部
hs1ihplo

hs1ihplo4#

你可以使用if指令:

  1. command_a
  2. if test $? = 255
  3. then
  4. fallback_command
  5. fi

字符串
一条线:

  1. command_a ; if test $? = 255 ; then fallback_command ; fi

展开查看全部
k7fdbhmy

k7fdbhmy5#

您的代码将始终执行fallback_command。原因是如果x不为空,则test x总是成功。例如,假设VAR等于100,因此您基本上执行test 100==255,并且由于字符串 100==255 不为空(它的长度为8个字符),因此条件成功。
你可以这样做:

  1. if (( VAR > 127 ))
  2. then
  3. # There was a problem starting the program
  4. ....
  5. elif (( VAR == 72 || VAR >118 ))
  6. then
  7. # Deal with exit codes 72 and 119 up to 127
  8. .....
  9. elif (( VAR > 0 ))
  10. # Deal with all other non-zero exit codes
  11. ....
  12. fi

字符串

展开查看全部
hgc7kmma

hgc7kmma6#

嗯,在尝试了一点之后,我发现了一种方法,

  1. a_command || export ECODE="$?" # Here non zero exit codes are suppressed.
  2. if [ "$ECODE" -eq 255 ]
  3. then
  4. fallback_command
  5. fi

字符串

13z8s7eq

13z8s7eq7#

使用set -e和陷阱:

  1. set -e
  2. trap cleanup ERR
  3. cleanup () {
  4. echo cleaning up
  5. }
  6. a_command && rc=0 || rc=$?
  7. case $rc in
  8. 0)
  9. # no error handling needed
  10. ;;
  11. 255)
  12. # handle error code 255
  13. fallback_command
  14. ;;
  15. 254)
  16. # handle error code 254
  17. another_fallback_command
  18. ;;
  19. *)
  20. # unhandled error code; subshell used so we can trigger `set -e`
  21. # and any associated traps without exiting directly
  22. (exit "$rc")
  23. ;;
  24. esac

字符串
如果没有使用ERR上的陷阱,我们可以像set -e一样直接退出:

  1. set -e
  2. a_command && rc=0 || rc=$?
  3. case $rc in
  4. 0)
  5. # no error handling needed
  6. ;;
  7. 255)
  8. # handle error code 255
  9. fallback_command
  10. ;;
  11. 254)
  12. # handle error code 254
  13. another_fallback_command
  14. ;;
  15. *)
  16. # unhandled error code; exit like `set -e` normally would
  17. exit "$rc"
  18. ;;
  19. esac

展开查看全部

相关问题