如何相对于 .command 文件而不是硬编码路径进行 cd?

如何相对于 .command 文件而不是硬编码路径进行 cd?

我正在为我的办公室设置一个项目模板,该模板使用.command文件来封装一些命令行函数,因为办公室里不是每个人都精通终端。这主要涉及项目内的一些路径更改,以及启动一些编译器/观察器,如compassgrunt

这是我遇到的问题 - 每个项目都有自己的 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 中运行其内部命令。

相关内容