Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 根据报价类型,~/.bash_配置文件别名中的pwd评估不同_Macos_Shell_Alias_Osx Elcapitan - Fatal编程技术网

Macos 根据报价类型,~/.bash_配置文件别名中的pwd评估不同

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_配置文件

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

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

这不起作用(无论我在哪个目录下,总是为$(pwd)传递~/Users/username):

作品:

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