我想知道是否有办法找出文件执行是如何启动的。
例如,考虑以下文件:
~/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
我试图通用,但它可能特定于bash
or zsh
。
答案1
这是一个bash
解决方案(对于#!/bin/bash
以 为第一行的脚本,或以 运行bash script...
)。
设置示例(两个脚本,a.sh
和b.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
正如您所看到的,在source
d 文件中,调用者可以通过"${BASH_SOURCE[1]}"
.
答案2
有了外壳就可以了bash
。source
可以为那里的文件提供一个参数。
这意味着您可以将 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