【发布时间】:2017-05-10 20:21:01
【问题描述】:
我有一棵这样的树:
repo
|-- dir
| |-- main_script.sh
| |-- subdir
| | |-- scritp1.sh
| | |-- script2.sh
我想在 script1.sh 中获取 script2.sh 并在 main_script.sh 中获取 script1.sh,然后从 repo 中调用 main_script:
$ pwd
.../repo
$ bash ./dir/main_script.sh
问题在于以下脚本:
main_script.sh:
#!/usr/bin/env bash
source ./subdir/script1.sh
script1.sh:
#!/usr/bin/env bash
source script2.sh
script2.sh:
#!/usr/bin/env bash
echo "Something useful"
我收到错误 ./dir/main_script.sh: line 2: ./subdir/script1.sh: No such file or directory。似乎 bash 正在寻找的子目录不是相对于 main_script.sh 而是相对于工作目录。我可以使用接受的答案表单 this question 或 this blog post 更改第一个脚本以获取脚本的位置,使 main_script.sh 看起来像这样:
#!/usr/bin/env bash
MYDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source "${MYDIR}/subdir/script1.sh"
然后我在 script1.sh 中获取 script2.sh 时出错:
...repo/dir/subdir/script1.sh: line 2: script2.sh: No such file or directory
似乎 bash 正在工作目录中寻找 script2.sh。
我不想在每个脚本中嵌入目录结构。 那么问题来了,如何正确导入bash中的相关脚本呢?
【问题讨论】:
-
顺便说一句,我建议避免 bash 脚本的
.sh扩展;这可以被解读为暗示与/bin/sh的兼容性。打算作为命令调用的东西(./yourscript)通常根本不应该有扩展名;打算作为库获取的东西应该有一个扩展名,表明它与哪个shell兼容(即yourlib.bash,或yourlib.sh,只有当它符合POSIX时)。相关 irc.freenode.org #bash 频道事实的历史可在 @wooledge.org/~greybot/meta/.sh 获得
标签: linux bash shell scripting