Bash 使用set-e(trap)在脚本中保存命令退出代码的最佳方法?
在使用Bash 使用set-e(trap)在脚本中保存命令退出代码的最佳方法?,bash,Bash,在使用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.prope
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/build环境脚本有关,其中不使用set-e
是不好的,因为它确实隐藏了错误,并且即使出现一些错误,脚本也会继续
现在,上面的代码唯一的问题是难看/难以阅读,在许多情况下,管道命令甚至在屏幕外可见,人们对代码的工作方式感到困惑
所以,问题是如何重写它以提高可读性。我们能给bash带来一些美吗?你可以用“!”特殊字符以避免退出脚本,并将指令分组以获取返回值:
#! /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
如果您使用的是“exit”而不是“return”,请不要忘记使用子shell来调用您的命令:
mycmd()
{
if [ $1 -eq 1]; then
exit 1
fi
exit 0
}
err=0
! {
$(mycmd 1)
err=$?
}
echo "err $err" # Err = 1