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
-d
xargs