我在 .gitconfig 上创建了一个别名:
[alias]
test = "!f() { \
for l in "$@"; do \
echo "$l"; \
done; \
}; f"
考虑命令:
git test "foo bar" last
我期望得到:
foo bar
last
但是,我得到了:
foo
bar
last
这与 bash 上类似的“for”命令的行为不同。为什么会发生这样的事?我该如何让这个命令正常工作?
最佳答案
问题是 Git 从别名扩展中去掉了双引号。您的别名定义缩小为一行:
"!f() { for l in "$@"; do echo "$l"; done; }; f"
Git 去掉所有未转义的双引号(当然还有前导的 !
),生成:
f() { for l in $@; do echo $l; done; }; f
您希望 shell 看到:
f() { for l in "$@"; do echo "$l"; done; }; f
这意味着您必须将其交给 Git:
"!f() { for l in \"$@\"; do echo \"$l\"; done; }; f"
现在每个内部双引号都已转义,Git 会将它们留在那里供 shell 查看。
(如果您的脚本变得复杂,我建议不要尝试将其编写为别名。如果您的 上的任何位置都有名为
并且运行 git-abc
的可执行脚本>$PATHgit abc
,Git 将运行您的 git-abc
脚本。请注意,当 Git 运行您的脚本时,Git 会增强其 >$PATH
包含git-core
目录,这样就可以使用.git-sh-setup
来获取各种有用的子程序。)
关于bash - 我应该如何正确循环 gitconfig 别名上的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51342201/