如果命令失败,如何退出?[重复]

2024-11-05 13:07:00
admin
原创
210
摘要:问题描述:我是 shell 脚本的新手。如果命令失败,我想打印一条消息并退出脚本。我试过:my_command && (echo 'my_command failed; exit) 但它不起作用。它继续执行脚本中此行后面的指令。我正在使用 Ubuntu 和 bash。解决方案 1:尝试:my_...

问题描述:

我是 shell 脚本的新手。如果命令失败,我想打印一条消息并退出脚本。我试过:

my_command && (echo 'my_command failed; exit)

但它不起作用。它继续执行脚本中此行后面的指令。我正在使用 Ubuntu 和 bash。


解决方案 1:

尝试:

my_command || { echo 'my_command failed' ; exit 1; }

四个变化:

  • 更改&&||

  • { }代替使用( )

  • 引入;之后exit

  • {前后空格}

由于您只想在命令失败(以非零值退出)时打印消息并退出,因此您需要一个||而不是&&

cmd1 && cmd2

cmd2成功时将运行cmd1(退出值0)。

cmd1 || cmd2

cmd2失败时cmd1(退出值非零)将会运行。

使用( )会使它们里面的命令在子 shell中运行,并且从那里调用exit会导致您退出子 shell 而不是原始 shell,因此执行继续在原始 shell 中。

为了克服这种使用{ }

最后两处更改是 bash 所必需的。

解决方案 2:

其他答案已经很好地涵盖了直接问题,但您可能还对使用感兴趣set -e。这样,任何失败的命令(在if测试等特定上下文之外)都会导致脚本中止。对于某些脚本,它非常有用。

解决方案 3:

如果您希望脚本中的所有命令都具有这种行为,只需添加

set -e 
set -o pipefail

在脚本的开头。这对选项告诉 bash 解释器在命令返回非零退出代码时退出。(有关为什么pipefail需要它的详细信息,请参阅http://petereisentraut.blogspot.com/2010/11/pipefail.html

但这不允许您打印退出消息。

解决方案 4:

还要注意,每个命令的退出状态都存储在 shell 变量 $? 中,您可以在运行命令后立即检查。非零状态表示失败:

my_command
if [ $? -eq 0 ]
then
    echo "it worked"
else
    echo "it failed"
fi

解决方案 5:

Providedmy_command是规范设计的,成功时返回 0,这&&与您想要的完全相反。您想要的||

另请注意,(在 bash 中这对我来说似乎不正确,但我无法从我所在的地方尝试。告诉我。

my_command || {
    echo 'my_command failed' ;
    exit 1; 
}

解决方案 6:

我破解了以下成语:

echo "Generating from IDL..."
idlj -fclient -td java/src echo.idl
if [ $? -ne 0 ]; then { echo "Failed, aborting." ; exit 1; } fi

echo "Compiling classes..."
javac *java
if [ $? -ne 0 ]; then { echo "Failed, aborting." ; exit 1; } fi

echo "Done."

在每个命令前加上一个信息性 echo,在每个命令后加上相同的行

if [ $? -ne 0 ];...。(当然,如果您愿意,可以编辑该错误消息。)

解决方案 7:

如果您想要保留退出错误状态,并且有一个每行一个命令的可读文件,您也可以使用:

my_command1 || exit
my_command2 || exit

然而,这不会打印任何额外的错误消息。但在某些情况下,失败的命令无论如何都会打印错误。

解决方案 8:

shelltrap内置命令允许捕获信号和其他有用的条件,包括失败的命令执行(即非零返回状态)。因此,如果您不想明确测试每个命令的返回状态,您可以说,trap "your shell code" ERR只要命令返回非零状态,shell 代码就会执行。例如:

trap "echo script failed; exit 1" ERR

请注意,与捕获失败命令的其他情况一样,管道需要特殊处理;上述情况不会捕获false | true

解决方案 9:

直接使用exit可能比较棘手,因为脚本可能来自其他地方(例如来自终端)。我更喜欢使用 subshel​​l set -e(另外错误应该进入 cerr,而不是 cout):

set -e
ERRCODE=0
my_command || ERRCODE=$?
test $ERRCODE == 0 ||
    (>&2 echo "My command failed ($ERRCODE)"; exit $ERRCODE)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用