Mic*_*kis 725
试试这句话:
exit 1
Run Code Online (Sandbox Code Playgroud)
替换1
为适当的错误代码.另请参见具有特殊含义的退出代码.
Shi*_*zmo 660
使用set -e
#!/bin/bash
set -e
/bin/command-that-fails
/bin/command-that-fails2
Run Code Online (Sandbox Code Playgroud)
脚本将在第一行失败后终止(返回非零退出代码).在这种情况下,command-that-failed2将不会运行.
如果要检查每个命令的返回状态,您的脚本将如下所示:
#!/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
Run Code Online (Sandbox Code Playgroud)
使用set -e,它看起来像:
#!/bin/bash
set -e
cd /project-dir
make
cd /project-dir2
make
Run Code Online (Sandbox Code Playgroud)
任何失败的命令都会导致整个脚本失败并返回退出状态,您可以使用$检查?.如果您的脚本很长或者您正在构建很多东西,那么如果您在任何地方添加返回状态检查,那将会非常难看.
c.g*_*rez 212
一个坏屁股的SysOps家伙曾经教过我三指爪技术:
yell() { echo "$0: $*" >&2; }
die() { yell "$*"; exit 111; }
try() { "$@" || die "cannot $*"; }
Run Code Online (Sandbox Code Playgroud)
这些功能是*NIX OS和shell风格强大.将它们放在脚本的开头(bash或其他),try()
你的语句和代码.
(根据 飞羊评论).
yell
:打印脚本名称和所有参数stderr
:
$0
是脚本的路径;$*
都是争论. >&2
意味着>
将stdout重定向到&pipe2
.管1
会stdout
本身.die
做同样的yell
,但以非0退出状态退出,这意味着"失败".try
使用||
(布尔值OR
),如果左边没有失败,它只评估右侧.
$@
是所有的争论,但不同.希望能解释一切.
kav*_*ias 29
如果您将调用脚本source
,您可以使用return <x>
其中<x>
将脚本退出状态(使用一个非零值的错误或虚假).当您exit <x>
使用脚本时,这也将按预期工作,但如果您调用可执行脚本(即直接使用其文件名),则返回语句将导致抱怨(错误消息"返回:只能从函数返回'或源脚本").
如果source
使用if ,则在调用脚本时<x>
,将导致退出启动脚本的shell,但可执行脚本将直接运行.
要在同一脚本中处理任何一种情况,您都可以使用
return <x> 2> /dev/null || exit <x>
Run Code Online (Sandbox Code Playgroud)
这将处理适合的调用.
注意:source
应该只是一个数字.
Jos*_*edy 11
我经常包含一个名为run()的函数来处理错误.我想要进行的每个调用都会传递给此函数,以便在发生故障时退出整个脚本.这比set -e解决方案的优势在于,当一行失败时,脚本不会以静默方式退出,并且可以告诉您问题所在.在以下示例中,未执行第3行,因为脚本在调用false时退出.
function run() {
cmd_output=$(eval $1)
return_value=$?
if [ $return_value != 0 ]; then
echo "Command $1 failed"
exit -1
else
echo "output: $cmd_output"
echo "Command succeeded."
fi
return $return_value
}
run "date"
run "false"
run "date"
Run Code Online (Sandbox Code Playgroud)
if
您可以利用短路评估来代替构造:
#!/usr/bin/env bash
echo $[1+1]
echo $[2/0] # division by 0 but execution of script proceeds
echo $[3+1]
(echo $[4/0]) || exit $? # script halted with code 1 returned from `echo`
echo $[5+1]
Run Code Online (Sandbox Code Playgroud)
注意由于交替运算符的优先级而必需的括号对.$?
是一个特殊的变量,用于退出最近调用的命令的代码.
归档时间: |
|
查看次数: |
597636 次 |
最近记录: |