Macos 根据报价类型,~/.bash_配置文件别名中的pwd评估不同
这是在OSX El Capitan上,但在我的Ubuntu别名中也会发生 我遇到了一个问题,我创建了一个别名来将工作目录传递给docker容器 这不起作用(无论我在哪个目录下,总是为$(pwd)传递~/Users/username): 作品:Macos 根据报价类型,~/.bash_配置文件别名中的pwd评估不同,macos,shell,alias,osx-elcapitan,Macos,Shell,Alias,Osx Elcapitan,这是在OSX El Capitan上,但在我的Ubuntu别名中也会发生 我遇到了一个问题,我创建了一个别名来将工作目录传递给docker容器 这不起作用(无论我在哪个目录下,总是为$(pwd)传递~/Users/username): 作品: alias phpqa='docker run --rm -u $UID -v $(pwd):/app eko3alpha/docker-phpqa' 但是,当传入错误的路径时,我的脚本中开始出现意外错误。所以我做了一个实验。我在~/.bash_配置文件
alias phpqa='docker run --rm -u $UID -v $(pwd):/app eko3alpha/docker-phpqa'
但是,当传入错误的路径时,我的脚本中开始出现意外错误。所以我做了一个实验。我在~/.bash_配置文件中添加了这两个别名
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
带双引号的别名始终返回用户主目录,而带单引号的别名返回当前目录。有人能解释这是为什么吗 别名定义与任何其他命令一样进行解析。在双引号内,变量替换(如
$UID
)和命令替换(如$(pwd)
)被展开。在单引号内,没有展开任何内容:唯一的特殊字符是终止单引号文本的单引号
假设在读取.bash_profile
时,您的用户ID是1000,当前目录是您的主目录/Users/username
,这将通过扩展docker run--rm-u 1000-v/Users/username:/app eko3alpha/docker phpqa
定义别名phpqa
这定义了别名phpqa
,扩展名为docker run--rm-u$UID-v$(pwd):/app eko3alpha/docker phpqa
。每次扩展别名时,它都会被相应的字符串替换,并且该字符串受通常的shell解析规则的约束。因此,每次使用别名时,都会使用变量UID
的当前值,并执行命令pwd
此别名的正确定义为
alias phpqa='docker run --rm -u "$UID" -v "$PWD:/app" eko3alpha/docker-phpqa'
$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
$ alias getpath='echo $(pwd)'
$ alias getpath
alias getpath='echo $(pwd)'
$ cd path/to/project
$ getpath
/Users/username/path/to/project
如果别名使用单引号,则在使用别名时对$(pwd)
求值
$ alias getpath="echo $(pwd)"
$ alias getpath
alias getpath='echo /Users/username'
$ cd path/to/project
$ getpath
/Users/username
$ alias getpath='echo $(pwd)'
$ alias getpath
alias getpath='echo $(pwd)'
$ cd path/to/project
$ getpath
/Users/username/path/to/project
搜索是一种有用的知识。如果单引号是文字,那么当我执行用单引号包装的“getpath2”时,为什么不得到“echo$(pwd)”。相反,我得到了“/Users/username/correct/path/to/project”这很简单,试试你自己:echo“echo$(pwd)”aaa和echo“echo$(pwd)”感觉到了区别吗?你的答案并没有解决我的问题,即为什么$(pwd)会根据我的表中的单引号和双引号进行不同的评估aliases@IporSircer,就在不久前——POSIX sh可以追溯到90年代。当然,它主要受ksh的影响,而ksh主要受伯恩的影响,因此我们可以肯定地追溯到70年代。这就解释了为什么我会根据引用的类型得到我的主目录和工作目录。谢谢你的解释!函数的末尾应该有
“$@”
来传递额外的参数(就像别名一样)。@Eko3alpha,…顺便说一句,Gilles在编写函数版本时实际上修复了别名中的一系列错误——例如,它可以在名称中有空格的目录中正常工作;如果未定义UUID
而不是运行-u-v
,则将显式地将空字符串传递给docker run
(从而提供更好的错误消息);而且效率更高,因为它不需要生成不必要的子shell来运行pwd
。你真的应该使用这个函数。
$ alias getpath='echo $(pwd)'
$ alias getpath
alias getpath='echo $(pwd)'
$ cd path/to/project
$ getpath
/Users/username/path/to/project