我正在为我的办公室设置一个项目模板,该模板使用.command
文件来封装一些命令行函数,因为办公室里不是每个人都精通终端。这主要涉及项目内的一些路径更改,以及启动一些编译器/观察器,如compass
或grunt
。
这是我遇到的问题 - 每个项目都有自己的 svn repo,每个用户的任何给定项目根目录的路径都会不同:
- 鲍勃:
/Users/bobsmith/work/clients/client-a/project-a
- 简:
/Users/janedoe/web/projects/project-a
我想将.command
文件放入一个能够找到项目根目录的项目内,无论项目位于系统中的什么位置。有什么办法可以实现这一点吗?也许通过引用正在.command
执行的路径?这是一个.command
已经到位的示例:
# Replace this path with your project directory - remember to ignore it in svn!
cd /Users/janedoe/web/projects/project-a
grunt watch
答案1
# This will cd into the directory in which the .command file exists
cd "$(dirname "$0")"
另一方面...
# This will define an environment variable that contains the full absolute path
#+ to the directory in which the .command file is kept, and then will cd into
#+ that directory
ABSPATH="$(cd "$(dirname "$0")" && pwd)"
cd "$ABSPATH"
为什么都是双引号?
如果没有它们,当用户在项目路径中有空格时,事情就会中断。此外——可能很明显——但如果用户无法进入其项目目录,这也会中断。
为什么是 $( ... ) 而不是 ` ... ` ?
第一种语法较新,比第二种语法更受欢迎。此外,它更容易看懂。如果您认为匹配括号很烦人,请尝试匹配反引号 - 尤其是当它们之间夹有普通单引号时。这两种语法都做同样的事情;派生一个子 shell 并在该子 shell 中运行其内部命令。