【发布时间】:2026-01-25 05:25:01
【问题描述】:
我正在编写包含链式printf 管道的 bash 脚本。 (成像构造 JSON 对象)
我的用法是这样的:printf \"abc\" | xargs printf
结果是 abc 不带引号。如果我想在第二个 printf 输出中保留引号,我需要做什么?
【问题讨论】:
-
请注意,这是使用
xargs而不使用-0或-d通常是个坏主意的原因之一。
我正在编写包含链式printf 管道的 bash 脚本。 (成像构造 JSON 对象)
我的用法是这样的:printf \"abc\" | xargs printf
结果是 abc 不带引号。如果我想在第二个 printf 输出中保留引号,我需要做什么?
【问题讨论】:
xargs 而不使用-0 或-d 通常是个坏主意的原因之一。
xargs 的行为与文档一致;它实现了类似 shell(但不是严格兼容 shell)的解析和引号删除。GNU 和 BSD 平台都有超出 POSIX 基线的扩展,可让您禁用此功能。
在具有任一 GNU 或 BSD 扩展的系统上,使用 -0 并使用 NUL 分隔您的输入:
printf '%s\0' \"abc\" | xargs -0 printf
使用 GNU xargs,您可以使用 -d 指定要使用的分隔符 -- 换行符有效的上下文:
printf '%s\n' \"abc\" | xargs -d $'\n' printf
【讨论】: