这是在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
带双引号的别名始终返回用户主目录,而带单引号的别名则返回当前目录。有人可以解释为什么会这样吗?
答案 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 them。 alias 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