[注意 - 我解决了使用bash函数遇到的问题,但我想了解为什么我的初始尝试不起作用。]
我在Windows中运行git,并使用Git 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
}
所以,我的问题已经解决,但我确实想了解为什么我的初始方法不起作用。显然有一些关于别名的东西,我不明白,大概是在'i in *'位。我的期望是bash会将字符串替换为别名映射,然后对其进行评估,但它似乎并不那么简单。
答案 0 :(得分:6)
我还没有对此进行全面分析,但这与您在别名中$i
扩展的时间有关。您执行此操作的方式,$i
可能会在别名创建期间初始化。在函数版本中,它将在运行时进行解释。尝试定义已显示的别名,然后运行:
alias pr # show how the alias is defined
如果用单引号定义别名,Bash会很乐意推迟$
- 变量的扩展。以下内容应与您的功能一样有效。
alias pr='for i in *; do cd $i; git pull --rebase; cd ..; done;'