可能重复:
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 ...
因此我拥有:
search.sh
脚本向<git_root>
目录 我想要的是什么:能够在test.sh
内的任何位置无误地运行<git_root>
。
P.S。:由于git存储库可以克隆到任何位置,因此无法使用search.sh
的永久绝对路径。
答案 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
或者像@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