~/.bash_profile 别名中 pwd 的不同评估取决于引用类型

different evaluation of pwd in ~/.bash_profile alias depending on type of quote

这发生在 OSX El Capitan 上,但也发生在我的 Ubuntu 别名中。

我 运行 遇到了一个问题,我创建的别名是为了将工作目录传递给 docker 容器。

这行不通(无论我在哪个目录,$(pwd) 总是传递 ~/Users/username):

alias phpqa="docker run --rm -u $UID -v $(pwd):/app eko3alpha/docker-phpqa"

作品:

alias phpqa='docker run --rm -u $UID -v $(pwd):/app eko3alpha/docker-phpqa'

但是,当传入错误的路径时,我的脚本开始出现意外错误。所以我做了一个实验。我将这两个别名添加到我的 ~/.bash_profile.

alias getpath="echo $(pwd)"
alias getpath2='echo $(pwd)'

我注销然后重新登录。

更改目录:

$ cd /Users/username/correct/path/to/project

执行两个别名:

$ getpath
/Users/username

$ getpath2
/Users/username/correct/path/to/project

带双引号的别名总是 returns 用户主目录,而带单引号的别名 returns 当前目录。有人可以解释为什么会这样吗?

别名定义像任何其他命令一样被解析。在双引号内,变量替换如 $UID 和命令替换如 $(pwd) 被展开。在单引号内,没有展开任何内容:唯一的特殊字符是终止单引号文字的单引号。

alias phpqa="docker run --rm -u $UID -v $(pwd):/app eko3alpha/docker-phpqa"

假设您的用户 ID 是 1000,当前目录是您的主目录 /Users/username 在您的 .bash_profile 被读取时,这定义了别名 phpqa 扩展 docker run --rm -u 1000 -v /Users/username:/app eko3alpha/docker-phpqa.

alias phpqa='docker run --rm -u $UID -v $(pwd):/app eko3alpha/docker-phpqa'

这定义了带有扩展名 docker run --rm -u $UID -v $(pwd):/app eko3alpha/docker-phpqa 的别名 phpqa。每次扩展别名时,它都会被相应的字符串替换,并且该字符串遵循通常的 shell 解析规则。所以每次使用别名时,都会使用变量UID的当前值并执行命令pwd

这个别名的正确定义是

alias phpqa='docker run --rm -u "$UID" -v "$PWD:/app" eko3alpha/docker-phpqa'

Always use double quotes around variable and command substitutions unless you know that you need to omit them$PWD$(pwd) 是等价的(shell 跟踪变量 PWD 中的当前目录)。

或者,忘记引用(除了替换周围的双引号)并使用函数。

phpqa () {
  docker run --rm -u "$UID" -v "$PWD:/app" eko3alpha/docker-phpqa "$@"
}

如果别名使用双引号,$(pwd) 会在 创建别名时计算

$ alias getpath="echo $(pwd)"
$ alias getpath
alias getpath='echo /Users/username'
$ cd path/to/project
$ getpath
/Users/username

如果别名使用单引号,则 $(pwd)used 时计算 $(pwd)

$ alias getpath='echo $(pwd)'
$ alias getpath
alias getpath='echo $(pwd)'
$ cd path/to/project
$ getpath
/Users/username/path/to/project