我有一个bash脚本,它顺序执行许多任务。
但是,因为我不想看到简单的状态消息(例如yum -y update
的长输出),所以我忽略了所有这些消息:
#!/bin/bash
(
yum -y update
cd /foo/bar
cp ~/bar /usr/bin/foo
...
...
) > /dev/null
这项工作做得很好,但如果出现问题,如cp
无法复制某些文件会怎么样?如果发生这种情况,我想在进程继续之前捕获错误并立即退出。
如何退出流程并显示相关错误?一般, 必须使用if / else子句,如下所示:
#!/bin/bash
yum -y update
if [ $? -ne 0 ]; then
echo "error "
exit 1
fi
但这种方法的问题在于它会显示过程;因此,我必须在每一行使用> /dev/null
;更重要的是,如果我有超过100个要做的事情,那么我将不得不使用许多if / else语句。
有一个方便的解决方案吗?
答案 0 :(得分:1)
而不是在(...)
中使用set -e
或bash -ec
执行命令来执行它们:
bash -ec 'set -e
yum -y update
cd /foo/bar
...
...
cp ~/bar /usr/bin/foo' > /dev/null 2> errlog
或使用set -e
:
(
set -e
yum -y update
cd /foo/bar
...
...
cp ~/bar /usr/bin/foo
) > /dev/null 2> errlog
-e
选项会确保在发生错误时立即退出子shell。