源bash脚本到另一个

时间:2013-01-09 14:15:37

标签: bash shell

  

可能重复:
  Reliable way for a bash script to get the full path to itself?

我有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方法。

当我从test.sh调用<git_root>/scripts/脚本时,一切正常,但只要我更改当前工作目录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 ...

因此我拥有:

  1. search.sh脚本向<git_root>目录
  2. 的相对路径

    我想要的是什么:能够在test.sh内的任何位置无误地运行<git_root>

    P.S。:由于git存储库可以克隆到任何位置,因此无法使用search.sh的永久绝对路径。

4 个答案:

答案 0 :(得分:3)

如果两个脚本都在同一个目录中,那么如果你得到正在运行的脚本所在的目录,你可以使用它作为调用另一个脚本的目录:

# 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

答案 1 :(得分:1)

你可以这样做:

# Get path the Git repo
GIT_ROOT=`git rev-parse --show-toplevel`

# Load the search functions
source $GIT_ROOT/scripts/search.sh

How get Git root directory

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

# 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"`

无论如何,您必须将此代码段放在使用其他脚本的所有脚本上。

答案 2 :(得分:1)

有没有办法识别这个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

答案 3 :(得分:0)

对于那些不想使用git的功能来查找父目录的人。如果你可以确定你将始终在git目录中运行脚本,你可以使用这样的东西:

git_root=""
while /bin/true ; do
    if [[ "$(pwd)" == "$HOME" ]] || [[ "$(pwd)" == "/" ]] ; then
        break
    fi

    if [[ -d ".git" ]] ; then
        git_root="$(pwd)"
        break
    fi

    cd ..
done

我没有对此进行过测试,但它只会循环回来,直到它到达您的主目录或/并且它将看到每个父目录中是否有.git目录。如果有,它会设置git_root变量,它会爆发。如果找不到,git_root将只是一个空字符串。然后你可以这样做:

if [[ -n "$git_root" ]] ; then
    . ${git_root}/scripts/search.sh
fi

IHTH