返回退出代码而不关闭shell

fue*_*zig 17 bash return exit return-code

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

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

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

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

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

ImH*_*ere 17

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

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

(exit 33)
Run Code Online (Sandbox Code Playgroud)

如果您需要-e激活并仍然避免使用非零退出代码退出 shell,请执行以下操作:

(exit 33) && true
Run Code Online (Sandbox Code Playgroud)

true命令永远不会执行,但用于构建一个不会被-eshell 标志退出的复合命令。

这会在不退出 shell(也不是源脚本)的情况下设置退出代码。

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

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

return 88
Run Code Online (Sandbox Code Playgroud)

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


Fra*_*ace 9

使用此而不是退出或返回:

[ $PS1 ] && return || exit;
Run Code Online (Sandbox Code Playgroud)

无论是否来源都可以.


She*_*evy 8

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