源bash脚本到另一个

可能重复:
bash脚本获得完整路径的可靠方法?

我有bash脚本test.sh ,它使用来自另一个search.sh脚本的函数,按照以下几行:

source ../scripts/search.sh
<call some functions from search.sh>

这两个脚本都位于git存储库中。 search.sh<git_root>/scripts/目录下, test.sh位于同一个目录下(但是,一般来说,可以位于<git_root>目录内的任何位置 - 我的意思是我不能依靠以下source search.sh方法)。

当我从<git_root>/scripts/调用test.sh脚本时,一切正常,但只要我更改当前工作目录test.sh失败:

cd <git_root>/scripts/
./test.sh         //OK
cd ..
./scripts/test.sh //FAILS
./scripts/test.sh: line 1: ../scripts/search.sh: No file or directory ...

因此我有:

  • search.sh脚本相对于<git_root>目录的路径
  • 我想要的是:能够从<git_root>任何位置运行test.sh而没有错误。

    PS:由于git存储库可以克隆到任何位置,所以不可能使用永久绝对路径来搜索search.sh


    如果两个脚本都在同一个目录中,那么如果您得到运行脚本所在的目录,则将其用作调用其他脚本的目录:

    # Get the directory this script is in
    pushd `dirname $0` > /dev/null
    SCRIPTPATH=`pwd -P`
    popd > /dev/null
    
    # Now use that directory to call the other script
    source $SCRIPTPATH/search.sh
    

    从我接受的问题的答案中,我标记了这个问题的一个重复:https://stackoverflow.com/a/4774063/440558


    有没有一种方法来识别这个Git仓库位置? 一个环境变量集? 您可以在脚本中设置PATH以包含Git存储库:

     PATH="$GIT_REPO_LOCATION/scripts:$PATH"
     . search.sh
    

    脚本完成后, PATH将恢复到原来的值,并且$GIT_REPO_LOCATION/scripts将不再是PATH一部分。

    问题是找到这个位置开始。 我想你可以在你的脚本中做这样的事情:

    GIT_LOCATION=$(find $HOME -name "search.sh" | head -1)
    GIT_SCRIPT_DIR=$(dirname $GIT_LOCATION)
    PATH="$GIT_SCRIPT_DIR:$PATH"
    . search.sh
    

    顺便说一下,现在$PATH已设置,我可以通过search.sh调用脚本,而不是在脚本目录中必须执行的./search.sh ,而PATH不包含. 这是当前目录(并且PATH不应该包含.因为它是一个安全漏洞)。

    还有一点需要注意的是,你也可以搜索.git目录,这可能是你正在寻找的Git仓库:

    GIT_LOCATION=$(find $HOME -name ".git" -type d | head -1)
    PATH="$GIT_LOCATION:$PATH"
    . search.sh
    

    你可以这样做:

    # Get path the Git repo
    GIT_ROOT=`git rev-parse --show-toplevel`
    
    # Load the search functions
    source $GIT_ROOT/scripts/search.sh
    

    如何获得Git根目录!

    或者像@Joachim Pileborg说的那样,但是你必须注意,你必须知道这个到另一个脚本的路径;

    # Call the other script
    source $SCRIPTPATH/../scripts/search.sh
    # Or if it is in another path
    source $SCRIPTPATH/../scripts/seachers/search.sh

    Apache Tomcat脚本使用这种方法:

    # resolve links - $0 may be a softlink
    PRG="$0"
    
    while [ -h "$PRG" ] ; do
      ls=`ls -ld "$PRG"`
      link=`expr "$ls" : '.*-> (.*)$'`
      if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
      else
        PRG=`dirname "$PRG"`/"$link"
      fi
    done
    
    PRGDIR=`dirname "$PRG"`
    

    无论如何,你必须把这个片段放在所有使用其他脚本的脚本上。

    链接地址: http://www.djcxy.com/p/56803.html

    上一篇: Source bash script to another one

    下一篇: How to debug a bash function that returns a value, and how to add newlines to a variable?