使用set -e(trap)在脚本中保存命令退出代码的最佳方法?

时间:2017-01-10 10:11:01

标签: 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.property 

背景:这主要与CI /构建环境脚本有关,其中不使用set -e是错误的,因为它确实隐藏了错误,即使您遇到一些错误,脚本仍会继续。

现在,上面代码的唯一问题是难看/难以阅读,并且在许多情况下,管道命令甚至在屏幕可见之外,人们对代码如何工作感到困惑

所以,问题是如何重写这一点以提高可读性。我们能为bash带来一些美感吗?

1 个答案:

答案 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
相关问题