从嵌套的源脚本中退出到顶级shell?

时间:2016-09-16 17:01:41

标签: bash

我想提供一个从bash脚本退出的陷阱,如果它是源代码而不是执行,但我想在另一个(库)文件中提供陷阱。脚本可能像这样组织:

a        sourced by code external to the library
+--b     sourced by a
   +-- c sourced by b

可能有许多级别的嵌套(多个文件,如b)。如果c来源,则a文件需要包含能够c正常退出(并且a设置非零退出状态)的代码。

正常退出的行为类似于调用exit的已执行脚本。

何时终止

bash脚本可以使用BASH_SOURCE数组来确定它是自己采购还是最外层脚本是否来源。

脚本堆栈可以作为数组${BASH_SOURCE[@]}使用,其中第一个元素是最新的脚本,最后一个是第一个。因此,它遵循:

  • 当前脚本(例如c)为${BASH_SOURCE[0]}
  • 最外面的脚本(例如a)是${BASH_SOURCE[-1]}
  • 可执行文件是$0

断言当前脚本已执行:

[[ "${BASH_SOURCE[0]}" == "$0" ]]

断言最外面的脚本已执行:

[[ "${BASH_SOURCE[-1]" == "$0" ]]

因此,脚本c可以确定脚本a是否像这样执行:

[[ "${BASH_SOURCE[-1]" == "$0" ]] || terminate

如何终止

c无法做到的是terminate。它不能exit,因为这会导致任何来源a退出。替代方案是return,但只将控制权传递回先前的b脚本。如果没有b,而a合作,则终止将无效。

此合作可以在ab中进行编码,但如果c b没有将控制权交还给a {1}}来源了。

ca方式终止exit吗?

我非常确信这是不可能的,因为源a不在其自己的过程中,但是以其他方式显示会很棒。我想也许是一种操纵调用堆栈的方法,因此return会从a返回,但在这样的想法中可能有太多的巫术......

0 个答案:

没有答案