一个简单的起点可能是将其添加到脚本的顶部:
#!/bin/bash
scriptdir="$(dirname "$0")"
cd "$scriptdir"
以下所有代码都将像在脚本目录中运行一样发生。
请注意,这是为了让脚本运行
鉴于它是一个用于编译的脚本,因此我怀疑你想要的是什么,因此它将放置在 src 树中一个非常特定的文件夹中(例如 configure 脚本或某种形式的 makefile)
基本原理
-
$0是运行脚本的完整路径。
- 来自
bash 人(我添加的格式):
特殊参数
shell 专门处理几个参数。这些参数可能
仅供参考;不允许分配给他们。
....
0 扩展为 shell 或 shell 脚本的名称。这是设置在
shell 初始化。
如果使用命令文件调用 bash,
$0 设置为该文件的名称。
如果使用 -c 选项启动 bash,则设置 $0
到
要执行的字符串之后的第一个参数,如果一个是
展示。否则设置为文件名
用于调用bash,
由参数零给出。
dirname 返回其参数的路径
-
cd 改变当前目录
因此,每个顶部带有此代码的脚本都将运行,就好像当前在该目录中时输入了 ./script。
从另一个角度来看
对于质量控制和冗余错误检查的措施,您可能需要实现一个包装函数,以检查特定文件夹结构或是否存在某些表明一切正确的文件。 (无论出于何种原因,dirname 和 cd 命令不起作用 - 我在这篇文章的底部有一个 Mac 示例)。这个概念有两个方面:
- 你正在做的事情是设置当前目录
- 您正在检查您所做的事情是否有效。
例如:
runcheck () {
versioncheck () {
head -n1 version | grep -q "### myapp V"
}
backout () {
echo "Problem verifying source paths. Are you sure your archive is complete?"
exit
}
[ -d ./src ] && [ -d ./docs ] && [ -d ../myapp ] && (versioncheck) || backout
return
}
该代码将检查以下内容:
- 目录
src与可执行脚本位于同一路径
- 目录
docs与可执行脚本位于同一路径
- 目录
myapp 存在于可执行脚本的下一级路径中
- 在与可执行脚本相同的路径中有一个名为
version 的文件,并且它的第一行 包含字符串### myapp V(例如,对于version 文件,它可能第一行写着:### myapp V1.4 ###)
然后,您可以将命令 runcheck 放置在脚本中重要的位置,以验证您是否在正确的位置:
完整的实现示例:
#!/bin/bash
scriptdir="$(dirname "$0")"
cd "$scriptdir"
runcheck () {
versioncheck () {
head -n1 version | grep -q "### myapp V"
}
backout () {
echo "Problem verifying source paths. Are you sure your archive is complete?"
exit
}
[ -d ./src ] && [ -d ./docs ] && [ -d ../myapp ] && (versioncheck) || backout
return
}
runcheck #initial check at start of script
## bunch of code
## goes here
runcheck #just checking again
## bunch of code
## goes here
runcheck #final check before really doing something bad
## end of script
旁注/补充:这将适用于bash,当不需要进行彻底检查以说明脚本文件的符号链接等时。(再次......在可移植源中代码压缩包等,我非常怀疑是这种情况)。
我建议阅读此主题:Getting the source directory of a Bash script from within
如果您想或曾经需要对这个主题有透彻的了解,以便更全面地应用它。
我再次强调使用你所知道的为你需要的东西量身定制的东西 - 例如,通常认为使用dirname "$(readlink -f "$0")" 可能更“稳健”,但是,在 Mac OS X 上,会给你 readlink: illegal option -- f ,并且对可移植脚本没有真正的好处,但更适用于引用可能是符号链接和/或包含在 $PATH 目录中的已安装二进制文件的位置