使 xargs 接受多行字符串作为单个参数

使 xargs 接受多行字符串作为单个参数
git log --format=%B -n 1 HEAD | xargs -I{} npx ts-node --esm ./foobar.ts {}

我有这行代码,其目的是使用 git 将最新的提交消息传递给脚本,该脚本将在消息中查找部署标签。

对于多于一行的提交消息,xargs 会多次调用 foobar.ts,并将提交消息的每一行作为输入,而不是将整个消息作为一个参数传递。我怎样才能解决这个问题?

答案1

您可以用来-0告诉xargs要传递给命令的参数在其输入上以 NUL 分隔,并且由于提交日志不能包含 NUL 字符,因此将传递整个输入(包括最后一行)作为一个参数传递给命令:

git log --format=%B -n 1 HEAD |
  xargs -r0 npx ts-node --esm ./foobar.ts

但请注意,虽然所有当前xargs实现都不会忽略该非分隔记录,在一般情况下,这对他们来说是一件潜在危险的事情,以及 POSIX 将在标准的下一版本中指定-r-0建议(但不强制)忽略它:

如果标准输入不为空并且不以空字节结尾,xargs则应忽略尾随的非空字节(因为这可能表示数据不完整),但可以将它们用作传递给实用程序的最后一个参数。

因此,依赖这一点可能无法适应未来的情况。您可以添加一个 NUL,(git...; printf '\0') | xargs -r0...但碰巧git log支持-z用 NUL 分隔提交的选项,这样就可以使其面向未来:

git log --format=%B -zn 1 HEAD |
  xargs -r0 npx ts-node --esm ./foobar.ts

甚至允许您发送多个提交。

或者,您可以使用 shell 的命令替换:

npx ts-node --esm ./foobar.ts "$(git log --format=%B -n 1 HEAD)"

命令替换会删除所有尾随换行符,包括最后一个非空行的行分隔符以及该行之后的所有空行(如果有),这可能是理想的。

在任何情况下,您都不能在不使用或与它一起使用的情况下使用xargs' ,仍然在其输入中进行引号处理,并且会在包含撇号的提交日志上阻塞,例如或破坏任何包含引号或反斜杠的内容。-I-0-dxargs

相关内容