是否有更好/更好的方法在使用set -e
的bash脚本中保存特定命令的返回码?
正如您所知,在陷阱模式下,除非您使用管道并且管道命令成功,否则脚本将退出。
#!/bin/bash
set -e
# a lot of code...
MY_RESULT=0
command-that-can-fail || MY_RESULT=$?
export MY_RESULT
# optionally
printf "MY_RESULT=${{MY_RESULT}}\n" >> env.property
背景:这主要与CI /构建环境脚本有关,其中不使用set -e
是错误的,因为它确实隐藏了错误,即使您遇到一些错误,脚本仍会继续。
现在,上面代码的唯一问题是难看/难以阅读,并且在许多情况下,管道命令甚至在屏幕可见之外,人们对代码如何工作感到困惑
所以,问题是如何重写这一点以提高可读性。我们能为bash带来一些美感吗?
答案 0 :(得分:1)
您可以使用'!'要避免退出脚本的特殊字符,并将指令分组以获取返回值:
#! /bin/sh
set -e
mycmd()
{
if [ $1 -eq 1]; then
return 1
fi
return 0
}
err=0
! {
mycmd 0
err=$?
}
echo "err $err" # Err = 0
err=0
! {
mycmd 1
err=$?
}
echo "err $err" # Err = 1
如果您正在使用"退出"而不是"返回",不要忘记使用子shell来调用命令:
mycmd()
{
if [ $1 -eq 1]; then
exit 1
fi
exit 0
}
err=0
! {
$(mycmd 1)
err=$?
}
echo "err $err" # Err = 1