根据报价类型对〜/ .bash_profile别名中的pwd进行不同的评估

时间:2016-09-20 19:45:20

标签: macos shell alias osx-elcapitan

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

我遇到了一个问题,我创建了一个别名,用于将工作目录传递给docker容器。

这不会工作(无论我在哪个目录,总是传递〜/ Users / username for $(pwd):

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

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

2 个答案:

答案 0 :(得分:4)

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

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

假设您的用户ID为1000且当前目录是您的/Users/username读取时的主目录.bash_profile,则会定义带有扩展{{1}的别名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' 定义别名phpqa。每次扩展别名时,它都会被相应的字符串替换,并且该字符串受通常的shell解析规则的约束。因此,每次使用别名时,都会使用变量docker run --rm -u $UID -v $(pwd):/app eko3alpha/docker-phpqa的当前值,并执行命令UID

此别名的正确定义是

pwd

Always use double quotes around variable and command substitutions unless you know that you need to omit themalias phpqa='docker run --rm -u "$UID" -v "$PWD:/app" eko3alpha/docker-phpqa' $PWD是等效的(shell跟踪变量$(pwd)中的当前目录)。

或者,忘记引用(替换旁边的双引号除外)并使用函数。

PWD

答案 1 :(得分:0)

如果别名使用双引号,则在别名创建时会评估$(pwd)

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

如果别名使用单引号,则在别名为 时评估$(pwd)

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