我想提供一个从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
合作,则终止将无效。
此合作可以在a
和b
中进行编码,但如果c
b
没有将控制权交还给a
{1}}来源了。
可c
以a
方式终止exit
吗?
我非常确信这是不可能的,因为源a
不在其自己的过程中,但是以其他方式显示会很棒。我想也许是一种操纵调用堆栈的方法,因此return
会从a
返回,但在这样的想法中可能有太多的巫术......