【问题标题】:How to execute from any directory Bash script that sources other Bash scripts (not using path variable)如何从源代码其他 Bash 脚本的任何目录 Bash 脚本执行(不使用路径变量)
【发布时间】:2019-07-14 18:51:31
【问题描述】:

我不想通过将脚本添加到我的 Path 变量来从任何目录执行 Bash 脚本。

我希望能够使用该文件的目录路径从任何目录执行脚本......但是我要执行的文件来自其他文件,这就是问题所在。

如果我在目录file 中有两个脚本myFunctions.shsourceFunctions.sh

sourceFunctions.sh

#!/bin/bash
source ./myFunctions.sh
echoFoo

myFunctions.sh

function echoFoo()
{
    echo "foo"
}

我可以运行 myFunctions.shfoo 将打印到控制台,但如果我进入一个目录并运行 myFunctions.sh 我得到错误

cd ..
file/sourceFunctions.sh
-bash: doFoo.sh: command not found

除非我在sourceFunctions.sh 中将source file/myFunctions.sh 更改为source file/myFunctions.sh

那么我怎样才能独立于我的工作目录进行源代码,以便我可以从任何我想要的工作目录运行sourceFunctions.sh

谢谢

【问题讨论】:

标签: linux bash


【解决方案1】:

你的想法是对的。不过不需要那么复杂:

source `dirname $0`/myFunctions.sh

我经常在脚本顶部计算“HERE”:

HERE=`dirname $0`

然后在我的脚本中根据需要使用它:

source $HERE/myFunctions.sh

需要注意的一点是 $HERE 通常是相对路径。事实上,它将是您实际用于运行脚本的任何路径,或“.”。如果您没有提供路径。因此,如果您在脚本中“cd”,$HERE 将不再有效。如果这是一个问题,有一种方法(不能马上想到)来确保 $HERE 始终是绝对路径。

【讨论】:

    【解决方案2】:

    我最终只是将脚本本身的目录路径变量用于源目录

    所以

    #!/bin/bash
    source ./myFunctions.sh
    echoFoo
    

    变成

    #!/bin/bash
    SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"
    source ${SCRIPTPATH}/myFunctions.sh
    echoFoo
    

    source

    【讨论】:

    • 这个解决方案比上面使用“dirname”的解决方案更复杂。是否存在应该首选此解决方案的情况?
    猜你喜欢
    • 1970-01-01
    • 2012-10-30
    • 2018-07-02
    • 2017-03-01
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多