我们说我有以下脚本文件:
〜/ SRC / setup.sh::
#!/usr/bin/env bash
dn=$( dirname "$0" )
source "$dn/init/init.sh"
〜/ SRC / INIT / init.sh :
#!/usr/bin/env bash
dn=$( dirname "$0" )
source "$dn/start.sh"
start_servers "param1" "param2"
〜/ SRC / INIT / start.sh :
#!/usr/bin/env bash
start_servers() {
# ...
printf "start the servers..."
# ...
}
获取第二个文件( start.sh )会产生:
$ ./setup.sh
./init/init.sh: line 4: ./start.sh: No such file or directory
./init/init.sh: line 6: start_servers: command not found
由于我从.
执行 setup.sh ,因此在获取文件后, start.sh 似乎来自.
好吧,但我想从适当的位置采购它。
知道怎么解决吗?提前谢谢。
答案 0 :(得分:4)
Bash有内置的$BASH_SOURCE
变量,类似于$0
,但是 - 与后者不同 - 即使在 sourced 时也能正确反映正在运行的脚本的名称
因此,只需在脚本中用$0
替换$BASH_SOURCE
即可。
答案 1 :(得分:-2)
如果您使用sh而不是source,它将按预期加载环境,而不是在同一环境中执行脚本:
dn=$( dirname "$0" )
sh "$dn/init/init.sh"
此更改将导致代码在子shell中运行,而不是在同一个shell中运行。对于需要外壳函数的脚本,您将无法执行此操作,因为您仍需要获取该函数才能访问该函数。但在你的情况下,唯一需要的脚本仍然可以获取,因为那里你不需要0美元。