如何在unix中找到脚本的启动者

如何在unix中找到脚本的启动者

我想知道是否有办法找出文件执行是如何启动的。

例如,考虑以下文件:

~/foo.sh

echo "Hello from foo.sh"
# print the name of the initiator/parent of this execution 

~/bar.sh

source ~/foo.sh

~/baz.sh

. ~/foo.sh

当我执行时

sh ~/bar.sh或者.~/bar.sh~/foo.sh应该打印~/bar.sh

sh ~/baz.sh或者.~/baz.sh~/foo.sh应该打印~/baz.sh


我试图通用,但它可能特定于bashor zsh

答案1

这是一个bash解决方案(对于#!/bin/bash以 为第一行的脚本,或以 运行bash script...)。

设置示例(两个脚本,a.shb.sh):

cat >a.sh <<'x' && chmod a+x a.sh
#!/bin/bash
echo This is a.sh
source b.sh
echo End a.sh
x

cat >b.sh <<'x' && chmod a+x b.sh
#!/bin/bash
echo This is b.sh
echo "BASH_SOURCE=(${BASH_SOURCE[@]}) and we are '${BASH_SOURCE[0]}' called by '${BASH_SOURCE[1]}'"
echo End b.sh
x

现在运行代码并查看输出:

./a.sh
This is a.sh
This is b.sh
BASH_SOURCE=(b.sh ./a.sh) and we are 'b.sh' called by './a.sh'
End b.sh
End a.sh

正如您所看到的,在sourced 文件中,调用者可以通过"${BASH_SOURCE[1]}".

答案2

有了外壳就可以了bashsource可以为那里的文件提供一个参数。

这意味着您可以将 foo.sh 构造为:

#!/bin/bash
echo "Hello from $1"

和 bar.sh 作为

#!/bin/bash
source ~/Codes/tests/foo.sh '~/bar.sh'

最后 baz.sh 看起来像这样:

#!/bin/bash
source ~/Codes/tests/foo.sh '~/baz.sh'

如果你关心如何脚本被调用,那么你也可以将 foo.sh 写为

#!/bin/bash
echo "Hello from $0"

和 bar.sh 作为

#!/bin/bash
source ~/Codes/tests/foo.sh

Hello from ./bar.sh如果您从脚本目录调用它,则会给出此信息。如果你从家里调用它,你会得到Hello from ~/bar.sh

相关内容