【发布时间】:2019-12-11 11:29:52
【问题描述】:
我正在尝试使用xargs 构建一个命令来传递配置参数:user.name 和user.email 到git commit。
由xargs 构建的命令:
git -c user.name=abc -c user.email=abc@mail.com commit
我尝试过的:
echo "-c user.name=abc -c user.email=abc@mail.com" | xargs -I % git % commit
但是,git 会返回:
未知选项:-c user.name=abc -c user.email=abc@mail.com
即使xargs 冗长,该命令也能正常工作。
echo "-c user.name=abc -c user.email=abc@mail.com" | xargs -tI % git % commit
这将打印要执行的命令git -c user.name=abc -c user.email=abc@mail.com commit,该命令在复制粘贴到终端时有效。
请注意,配置参数由空格分隔。
Some context for what exactly I am trying to do by passing configuration parameters
【问题讨论】:
-
哪个操作系统?
-J而不是-I解决了 OS X 的问题。(问题是-I %将%替换为 作为一个参数 行(就像你写了git "-c user.name=abc -c user.email=abc@mail.com" commit)。 Linux(其xargs不支持-J)您可以使用子shell:xargs -I % bash -c "git % commit" -
@Amadan,我在 linux shell 和 git-bash for windows 上都试过了。
xargs不应该冗长显示这个git "-c user.name=abc -c user.email=abc@mail.com" commit而不是这个git -c user.name=abc -c user.email=abc@mail.com commit吗? (基于-I描述的问题) -
没有。我说“好像”。
xargs实际上并不构造引号;它使用类似于此的 C 函数执行该函数:execl("git", "-c user.name=abc -c user.emal=abc@mail.com", "commit"),其中它执行带有两个参数的git命令。用空格分隔命令行(或将带引号的字符串作为一个)是 shell 的工作,但这里不涉及 shell。 verbose 只是打印所有与空格相关的参数,就像 echo 一样;你无法区分参数是如何拆分的。