2014-11-05 64 views
2

[注 - 我解决我遇到了使用bash函数的问题,但我想知道为什么我最初的尝试没有成功。]bash - 如何解释别名?

我在Windows中运行git,并使用Gi​​t的bash命令行应用程序管理存储库。 我有几个仓库,我经常想要一次拉。以前我只是通过在命令行中输入以下内容来完成此操作:

for i in *; do cd $i; git pull --rebase; cd ..; done; 

为了节省时间,我决定为此创建一个别名。所以,我创建的主目录下的.bashrc文件(C:在我的情况/ GIT),并添加行

alias pr="for i in *; do cd $i; git pull --rebase; cd ..; done;" 

然而,这并没有在所有的工作中,产量

sh.exe" cd: /etc/profile.d/*.sh: No such file or directory 

后面跟着git抱怨说它不在仓库中。单次呼叫输出将重复20次以上。 MinGW文件系统的根目录(其中/ etc源自上面)是我将git安装到(C:/ Program Files(x86)/ Git)的地方。现在

,我创造我的.bashrc文件中的函数,而不是解决到底这个问题,像这样:

pr(){ 
    for i in * 
    do 
     cd $i 
     git pull --rebase 
     cd .. 
    done 
} 

所以,我的问题是解决了,但我想知道为什么我的初始方法不起作用。很明显,有些别名我不明白,大概是,把'我'放在一边。我的期望是bash会替换别名映射的字符串,然后对其进行评估,但似乎并不那么简单。

+2

如果在'pr'别名赋值和重新来源之前添加'echo“i = $ i”',会发生什么? – BroSlow 2014-11-05 11:26:08

+2

此外,您可能希望将其短路条件'cd“$ i”&& git pull --rebase && cd ..'。否则,你可能会得到一些奇怪的结果('$ i'不是目录,但你仍然运行'git'并向上移动一个等级......) – BroSlow 2014-11-05 11:34:56

+0

[bash alias命令可能带有单引号和双引号] (http://stackoverflow.com/questions/20111063/bash-alias-command-with-both-single-and-double-quotes) – tripleee 2014-11-05 13:36:46

回答

6

我还没有完整分析这个,但它与你的$i在别名的时间扩展的时间有关。你这样做,$i可能会在创建别名时被初始化。在函数版本中,它将在运行时解释。尝试定义的还有你的别名,然后运行:

alias pr # show how the alias is defined 

击会很乐意推迟$ - 变量扩展,如果你用单引号定义的别名。以下应该和你的功能一样。

alias pr='for i in *; do cd $i; git pull --rebase; cd ..; done;' 
+1

有人请解释'-1' – BroSlow 2014-11-05 11:36:42

+0

+1这是绝对正确的;在别名被定义之前,双引号内的'$ i'被扩展。当定义函数时,参数展开不是在单引号内执行的,或者是在函数体内(如发现的OP)执行的。 – chepner 2014-11-05 13:29:29

+0

啊哈,看来你是对的。 '别名pr'给出以下输出: 'alias pr ='for in in *;做cd /etc/profile.d/*.sh; git pull --rebase; cd ..;完成;'' 所以这是'$ i'被扩展的问题,而不是像我想的那样与'*'有关。 我已验证它也可以与单引号一起使用。 – Jenesis 2014-11-05 14:00:44