【发布时间】:2017-05-01 14:57:25
【问题描述】:
假设我有以下脚本文件:
~/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在源脚本中将是父级的$0,这就是失败的原因。参见this answer了解如何确定当前脚本文件的位置 -
source将搜索$PATH中的目录。也许你应该把包含所有这些脚本的目录放在$PATH中。 -
这里还有一个潜在的问题:即使修复了这个问题,setup.sh 将
dn设置为~/src,然后init.sh 将其设置为~/src/init;当 init.sh 完成时,它仍然会被设置为 ~/src/init,所以如果 setup.sh 在获取 init.sh 之后使用它,它不会指向预期的位置。 -
@GordonDavisson:真的,谢谢!