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