我正在Bash中编写一个脚本来测试一些代码。但是,如果编译代码一开始就失败了,那么运行测试似乎很愚蠢,在这种情况下,我将中止测试。
有没有一种方法,我可以这样做,而不包装整个脚本在一个while循环和使用中断?像是叮叮当当的后藤?
我正在Bash中编写一个脚本来测试一些代码。但是,如果编译代码一开始就失败了,那么运行测试似乎很愚蠢,在这种情况下,我将中止测试。
有没有一种方法,我可以这样做,而不包装整个脚本在一个while循环和使用中断?像是叮叮当当的后藤?
当前回答
使用set -e
#!/bin/bash
set -e
/bin/command-that-fails
/bin/command-that-fails2
脚本将在第一行失败后终止(返回非零退出代码)。在这种情况下,command-that-fails2将不会运行。
如果你要检查每一个命令的返回状态,你的脚本看起来像这样:
#!/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
任何失败的命令都将导致整个脚本失败,并返回一个退出状态,您可以使用$?如果你的脚本很长,或者你构建了很多东西,如果你到处添加返回状态检查,那就会很难看。
其他回答
试试这句话:
exit 1
用适当的错误代码替换1。请参见具有特殊含义的退出代码。
使用set -e
#!/bin/bash
set -e
/bin/command-that-fails
/bin/command-that-fails2
脚本将在第一行失败后终止(返回非零退出代码)。在这种情况下,command-that-fails2将不会运行。
如果你要检查每一个命令的返回状态,你的脚本看起来像这样:
#!/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
任何失败的命令都将导致整个脚本失败,并返回一个退出状态,您可以使用$?如果你的脚本很长,或者你构建了很多东西,如果你到处添加返回状态检查,那就会很难看。
我经常包含一个名为run()的函数来处理错误。我想进行的每个调用都传递给这个函数,因此当遇到失败时整个脚本都会退出。与set -e解决方案相比,这种方法的优点是,当一行失败时,脚本不会静默退出,并且可以告诉您问题是什么。在下面的示例中,第三行没有执行,因为脚本在调用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"
一个SysOps的人曾经教过我三指爪技术:
yell() { echo "$0: $*" >&2; }
die() { yell "$*"; exit 111; }
try() { "$@" || die "cannot $*"; }
这些函数是*NIX OS和shell风味健壮的。把它们放在脚本的开头(bash或其他),try()你的语句和代码。
解释
(根据飞行绵羊的评论)。
大喊:打印脚本名称和所有参数到stderr: $0是脚本的路径; $*都是参数。 >&2表示>将标准输出重定向到&管道2。管道1本身就是标准输出。 Die的作用与yell相同,但是以非0的退出状态退出,这意味着“失败”。 try使用||(布尔OR),如果左边失败,它只计算右边。 $@又是所有的参数,但有所不同。
您可以通过以下方式通过程序名称关闭程序:
对于软退出做
pkill -9 -x programname # Replace "programmname" by your programme
对于硬出口
pkill -15 -x programname # Replace "programmname" by your programme
如果你想知道如何评估关闭程序的条件,你需要定制你的问题。