返回退出代码而不关闭shell

时间:2011-05-24 15:01:41

标签: bash return exit return-code

我想从另一个脚本中调用的BASH脚本返回退出代码,但也可以直接调用。它大致如下:

#!/bin/bash
dq2-get $1
if [ $? -ne 0 ]; then
  echo "ERROR: ..."
  # EXIT HERE
fi
# extract, do some stuff
# ...

现在在行EXIT HERE中,脚本应该退出并返回退出代码1.问题是

  • 我不能使用return,因为当我忘记找到脚本而不是调用它时,返回退出,脚本的其余部分将被执行并搞砸了。
  • 我无法使用exit,因为这会关闭shell。
  • 我不能使用好的技巧kill -SIGINT $$,因为这不允许返回退出代码。

有没有可行的替代方案我忽略了?

5 个答案:

答案 0 :(得分:9)

使用此代替退出或返回:

[ $PS1 ] && return || exit;

无论是否来源都可以。

答案 1 :(得分:8)

您可以使用x"${BASH_SOURCE[0]}" == x"$0"来测试脚本是否来源或调用(如果已获取,则为false,如果已调用则为true),并相应地returnexit

答案 2 :(得分:1)

另一种选择是使用一个函数并将返回值放入其中,然后简单地获取脚本(source processStatus.sh)或调用脚本(./processStatus.sh)。例如,考虑需要将值返回到stopProcess.sh脚本的processStatus.sh脚本,但也需要在不使用源的情况下单独调用命令行(仅包含相关部分) 例如:

 function checkProcess {
   if [ $1 -eq "50" ]
   then
       return 1       
   else
       return 0
   fi       
 }

 checkProcess

source processStatus.sh $1
RET_VALUE=$?
if [ $RET_VALUE -ne "0" ]
then
    exit 0
fi

答案 3 :(得分:1)

问题标题的答案(不像其他答案一样在正文中出现)

  

返回退出代码而不关闭外壳

(exit 33)

设置退出代码而不退出外壳程序(也没有源脚本)。

对于更复杂的退出问题(具有特定的退出代码),无论是执行还是获取:

#!/bin/bash
[ "$BASH_SOURCE" == "$0" ] &&
    echo "This file is meant to be sourced, not executed" && 
        exit 30

return 88

如果执行,将设置退出代码30(带有错误消息)。
如果有来源,则退出代码为88。 将在不影响调用外壳的情况下退出两者执行或采购。

答案 4 :(得分:0)

如果您use set -e in the beginning of the script.可以使用return

如果您只是想检查函数是否未返回错误,我建议您像这样重写代码:

#!/bin/bash

set -e # exit program if encountered errors

dq2-get ()
{
  # define the function here
  # ...
  if [ $1 -eq 0 ]
  then
    return 0
  else
    return 255
  # Note that nothing will execute from this point on,
  # because `return` terminates the function.
}

# ...
# lots of code ...
# ...

# Now, the test:
# This won't exit the program.
if $(dq2-get $1); then
  echo "No errors, everything's fine"
else
  echo "ERROR: ..."
fi
# These commands execute anyway, no matter what
# `dq2-get $1` returns (i.e. {0..255}).
# extract, do some stuff
# ...

现在,如果函数dq2-get $1返回错误,则上面的代码不会离开程序。但是,由于set -e,全部实现该功能本身将退出程序。下面的代码描述了这种情况:

# The function below will stop the program and exit
# if it returns anything other than `0`
# since `set -e` means stop if encountered any errors.
$(dq2-get $1)
# These commands execute ONLY if `dq2-get $1` returns `0`
# extract, do some stuff
# ...