Linux陷阱&&的最佳实践

chr*_*ris 1 linux error-handling bash bash-trap

使用trap可能有助于编写最干净的bash脚本.但是我想知道是否存在解决方案以便在以下情况下捕获错误:

GNU bash,版本4.2.45

好的

#!/bin/bash
trap 'echo OK i see error at line $LINENO;exit' ERR 
unknowncommand
echo "test KO should never reach me"
Run Code Online (Sandbox Code Playgroud)

案例KO

#!/bin/bash
trap 'echo OK i see error at line $LINENO;exit' ERR
unknowncommand && echo "miss the trap"
echo "test KO should never reach me"
Run Code Online (Sandbox Code Playgroud)
  • 不幸的是,我们到达最后一句话,好像&&使整个句子不是ERR.

Tod*_*obs 6

您想要评估整个评估的退出状态,而不是尝试短路.一种方法是将整个事物包装在子shell中.例如:

#!/bin/bash
trap 'echo "OK i see error at line $LINENO"; exit' ERR
(unknowncommand && echo "miss the trap")
echo "test KO should never reach me"
Run Code Online (Sandbox Code Playgroud)

这按预期工作.结果如下:

$ /tmp/err.sh 
/tmp/err.sh: line 3: unknowncommand: command not found
OK i see error at line 3
Run Code Online (Sandbox Code Playgroud)