Shell脚本:死于任何错误

Pis*_*tos 35 bash shell scripting

假设shell脚本(/ bin/sh或/ bin/bash)包含多个命令.如果任何命令的退出状态失败,如何干净地使脚本终止?显然,可以使用if块和/或回调,但是有更清晰,更简洁的方法吗?使用&&也不是一个选项,因为命令可能很长,或者脚本可能有非常重要的东西,如循环和条件.

mat*_*mat 61

随着标准shbash,你可以

set -e
Run Code Online (Sandbox Code Playgroud)

它会

$ help set
...
        -e  Exit immediately if a command exits with a non-zero status.
Run Code Online (Sandbox Code Playgroud)

它也适用于(我可以收集的)zsh.它也适用于任何Bourne shell后代.

使用csh/ tcsh,您必须使用启动脚本#!/bin/csh -e

  • 请注意,条件语句中的命令可能会失败而不会导致脚本退出 - 这是至关重要的.例如:if grep something/some/where; 然后:它被发现; 别的:没找到; fi工作正常,无论是否在/ some/where中找到了什么. (3认同)

Bar*_*run 17

可能你可以使用:

$ <any_command> || exit 1
Run Code Online (Sandbox Code Playgroud)

  • 实时和学习:Bash具有命令分组功能,因此不需要我提到的"eval"技巧.相反,使用`<any_command> || {echo"请确保..."1>&2; 出口; }`(注意关闭之前所需的`;``). (15认同)
  • 此模式可用于**在个别命令失败时有选择地退出**,并且**如果您要先打印自定义错误消息**。要执行后者,请使用类似&lt;&lt; any_command&gt; ||的方法。eval'echo“请确保...” 1&gt;&2; 退出1”注:必须使用“ eval”技巧才能将“ echo”和“ exit”命令组合在一起而不创建_sub_-shell;使用子外壳(如果使用括号会发生这种情况)将使“退出”无效。 (2认同)