bash - 我应该如何正确循环 gitconfig 别名上的列表?

标签 bash git shell

我在 .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 的可执行脚本>$PATH 并且运行 git abc,Git 将运行您的 git-abc 脚本。请注意,当 Git 运行您的脚本时,Git 会增强其 >$PATH 包含git-core目录,这样就可以使用.git-sh-setup来获取各种有用的子程序。)

关于bash - 我应该如何正确循环 gitconfig 别名上的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51342201/

相关文章:

bash - Github:使用 Bash 上传发布 Assets

git - 打开 pull 请求后如何压缩提交?

linux - 在文件夹中的 gzip 文件中查找字符串

git - 使用 git 发布到 node.js

linux - qstat 和长作业名称

regex - sed 仅在两个已知字符串之间替换字符

linux - bash 'ls' 检查文件存在后找不到文件

arrays - 如何避免在 Bash `printf` 中使用空数组打印任何内容?

bash - 通过 ssh 调用交互式 bash 脚本

Git - 推送后恢复 merge 的所有提交