源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?