问题 返回退出代码而不关闭shell


我想从另一个脚本中调用的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 $$,因为这不允许返回退出代码。

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


10545
2018-05-24 15:01


起源

不要忘记源脚本是我的建议。 - Neil Butterworth
软件应始终以滥用不会导致问题的方式编写。 - fuenfundachtzig
我不同意尼尔斯的建议。相反,不要使用脚本但总是调用它。 - William Pursell


答案:


您可以使用 x"${BASH_SOURCE[0]}" == x"$0" 测试脚本是否被采购或调用(如果是sourced则为false,如果调用则为true)和 return 要么 exit 因此。


7
2018-05-24 15:07



我试过了,但我感到无聊,因为我无法把它变成一个 function (因为那时我又错过了退出的方式) - 我必须放置一个 if 脚本中可能发生错误的每个位置的构造。或者,还有更好的方法? - fuenfundachtzig
您可以让if语句成为信号陷阱的一部分,然后用kill -SIGWHATEVER $$替换每个EXIT - Shea Levy


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

[ $PS1 ] && return || exit;

无论是否来源都可以。


8
2018-01-24 23:03



如果使用单支架 [  ] 相反 [[  ]],它会合作 sh 也。 - FelikZ
好,谢谢。 ... - FractalSpace
它对我来说不起作用(以脚本运行不起作用),但以下工作: [ -v PS1 ] && return || exit。一种轻松测试的方法: [ -v PS1 ] && (echo returning; return) || (echo exiting; exit) - VasyaNovikov
此外,如果我理解正确,这个解决方案在从另一个脚本内部源代码时不起作用。然而,接受的答案适用于那种(复杂)场景。 - VasyaNovikov


另一种选择是使用一个函数并将返回值放入其中,然后简单地获取脚本(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

1
2018-01-02 09:18