返回退出代码而不关闭 shell

问题描述 投票:0回答:6

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

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

现在在

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

  • 我不能使用
    return
    ,因为当我忘记获取脚本而不是调用它时,返回将not退出,并且脚本的其余部分将被执行并弄乱事情。
  • 我无法使用
    exit
    ,因为这会关闭外壳。
  • 我不能使用这个好技巧
    kill -SIGINT $$
    ,因为这不允许返回退出代码。

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

bash return exit return-code
6个回答
25
投票

问题标题的答案(不像其他答案那样在正文中)是:

在不关闭 shell 的情况下返回退出代码

(exit 33)

如果您需要激活

-e
并且仍避免使用非零退出代码退出 shell,则执行以下操作:

(exit 33) && true

true
命令永远不会执行,但用于构建不由
-e
shell 标志退出的复合命令。

设置退出代码而不退出 shell(也不是源脚本)。

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

#!/bin/bash [ "$BASH_SOURCE" == "$0" ] && echo "This file is meant to be sourced, not executed" && exit 30 return 88
如果执行,将设置退出代码 30(带有错误消息)。

如果已获取,则退出代码为 88。 将退出执行或采购,而不影响调用 shell。

使用它代替退出或返回:

12
投票
[ $PS1 ] && return || exit;

无论是否有来源都有效。
    

您可以使用

8
投票
来测试脚本是否已获取或调用(如果已获取则为 false,如果调用则为 true),并相应地使用

return

exit

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

2
投票
check_process () { if [ "$1" -eq "50" ] then return 1 else return 0 fi }

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

如果您在脚本开头

0
投票
return

,则可以使用

set -e
如果您只是想检查函数是否返回错误,我宁愿建议像这样重写您的代码:

#!/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
# ...

谢谢你的问题,我的情况是

0
投票
一个文件进行一些设置,但如果不满足某些条件,则结束脚本并跳过设置操作。

我遇到了尝试使用 
exit()

的问题,实际上导致了我的终端关闭,并发现自己在这里:D

在审查了特定解决方案的选项后,我只是选择了如下所示的选项,我还认为
Deepaks回答

值得审查,如果这种方法适用于您的情况。

if [ -z "$REQUIRED_VAR" ]; then echo "please check/set \$REQUIRED_VAR ..." echo "skipping logic" else echo "starting logic" doStuff() echo "completed logic" fi


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.