#!/bin/bash
# I'm assuming you're using make
cd /project-dir
make
if [[ $? -ne 0 ]] ; then
exit 1
fi
cd /project-dir2
make
if [[ $? -ne 0 ]] ; then
exit 1
fi
使用 set -e 它看起来像:
#!/bin/bash
set -e
cd /project-dir
make
cd /project-dir2
make
如果要使用 source 调用脚本,则可以使用 return <x> ,其中 <x> 将是脚本退出状态(对错误使用非零值或为false) . 当您使用脚本时,这也将按预期工作,但如果您调用可执行脚本(即直接使用其文件名),则return语句将导致抱怨(错误消息"return: can only `return' from a function or sourced script") .
7 回答
试试这句话:
用适当的错误代码替换
1
. 另见Exit Codes With Special Meanings .使用 set -e
脚本将在第一行失败后终止(返回非零退出代码) . 在这种情况下,command-that-failed2将不会运行 .
如果要检查每个命令的返回状态,您的脚本将如下所示:
使用 set -e 它看起来像:
任何失败的命令都将导致整个脚本失败并返回退出状态,您可以使用 $? 进行检查 . 如果您的脚本很长,或者如果您在任何地方添加返回状态检查,那么您将变得非常难看 .
一个坏屁股的SysOps家伙曾经教过我三指爪技术:
这些功能是* NIX OS和shell风格强大 . 将它们放在脚本的开头(bash或其他),
try()
你的语句和代码 .解释
(根据flying sheep评论) .
yell
:将脚本名称和所有参数打印到stderr
:$0
是脚本的路径;$*
都是参数 .>&2
表示>
将stdout重定向到&pipe2
. pipe1
本身就是stdout
.die
与yell
相同,但以非0退出状态退出,这意味着“失败” .try
使用||
(布尔值OR
),如果左侧没有失败,则仅评估右侧 .$@
再次是所有参数,但different .希望能解释一切 .
如果要使用
source
调用脚本,则可以使用return <x>
,其中<x>
将是脚本退出状态(对错误使用非零值或为false) . 当您使用脚本时,这也将按预期工作,但如果您调用可执行脚本(即直接使用其文件名),则return语句将导致抱怨(错误消息"return: can only `return' from a function or sourced script") .如果使用
exit <x>
,当使用source
调用脚本时,将导致退出启动脚本的shell,但可执行脚本将直接运行 .要在同一脚本中处理任何一种情况,您都可以使用
这将处理适合的调用 .
注意:
<x>
应该只是一个数字 .我经常包含一个名为run()的函数来处理错误 . 我想要进行的每个调用都会传递给此函数,以便在发生故障时退出整个脚本 . 这比set -e解决方案的优势在于,当一行失败时,脚本不会以静默方式退出,并且可以告诉您问题所在 . 在以下示例中,未执行第3行,因为脚本在调用false时退出 .
而不是
if
构造,您可以利用short-circuit evaluation:注意由于交替运算符的优先级而必需的括号对 .
$?
是一个特殊变量,用于退出最近调用的命令的代码 .我有同样的问题,但不能问它,因为它会是重复的 .
使用exit时接受的答案在脚本稍微复杂时不起作用 . 如果使用后台进程检查条件,则退出仅退出该进程,因为它在子shell中运行 . 要杀死脚本,你必须明确地杀死它(至少这是我所知道的唯一方法) .
这是一个关于如何做的小脚本:
这是一个更好的答案,但仍然不完整,我真的不知道如何摆脱繁荣部分 .