~/.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
这发生在 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