【问题标题】:How can I make source location-independent within my application's directory tree?如何在我的应用程序的目录树中使源位置独立?
【发布时间】: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 questionthis 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


【解决方案1】:

source 命令支持 PATH。因此,您只能在一个地方编辑它,新的 PATH 将被所有其他地方继承:

mydir=${BASH_SOURCE#/*}            # the normalization being done previously was needless
                                   # (and all-caps names are reserved for variables with
                                   # meaning to the shell or operating system).

PATH="$mydir:$mydir/subdir:$PATH"  # no export needed for a variable already in environment

source script1.sh                  # use non-qualified path

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-17
    • 2013-07-25
    • 1970-01-01
    • 2019-05-01
    • 2014-01-22
    • 2012-10-04
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多