【问题标题】:Using -0 with xargs将 -0 与 xargs 一起使用
【发布时间】:2011-09-17 13:14:49
【问题描述】:

我正在尝试为 xargs 提供 NUL 分隔的输入。为此,我有这个:

$ echo -n abc$'\000'def$'\000' | xargs -0 -L 1

我明白了

abcdef

我想知道为什么它不打印 o/p as

abc
def

【问题讨论】:

  • 我建议使用printf 命令而不是echo。它的行为更加一致。 echo 可以是一个外部命令/bin/echo,它因系统而异,或者它是几个不同 shell 中的内置 shell,同样在一个系统与另一个系统之间具有不同的行为。这对于简单的echo hello world 情况很好,并且当您的脚本仅用于 bash 时可能没问题,但对于您正在做的任何复杂的事情,我会使用printf。在你的情况下:printf 'abc\0def\0'
  • 我刚刚意识到printf 也是一个bash 内置以及一个外部命令,但差异相对较小。

标签: linux bash xargs


【解决方案1】:

您的主要问题是您忘记了-e

$ echo -n abc$'\000'def$'\000' |cat -v
abcdef

没有看到零字节。但是这个:

$ echo -en abc'\000'def'\000' |cat -v
abc^@def^@

更像是,^@cat -v 显示零字节的方式。现在为xargs

$ echo -en abc'\000'def'\000' | xargs -0 -L 1
abc
def

在 bash 提示符下尝试 help echo

【讨论】:

  • 谢谢,完美答案,是的,我忘了-e!
  • 并非如此:您希望 $'\000' 在 echo 的参数列表中生成一个文字 NUL 字符,但它没有。由于参数列表在进程之间的通信方式(C 字符串数组,以零结尾),遗憾的是无法在参数中包含文字 NUL。
  • od -c 是查看控制字符的更好方法
  • @tripleee:不知道什么意思。 echo 将解释反斜杠八进制代码(当给出-e 时)并将其发送到标准输出,没有人试图将零字节放入argv
  • @abc:确切地说,您必须使用一个实用程序,它允许您以某种方式象征性地表示它们;当然echo -e 允许您这样做,但是您最初对echo -n 的尝试非常好,但由于我称之为相当深奥的原因而失败了。
【解决方案2】:

尝试将输入视为单引号字符串。

echo -ne "abc\0def\0" | xargs -0 -L 1

【讨论】:

    猜你喜欢
    • 2016-12-27
    • 2019-04-12
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2015-07-11
    • 2018-07-30
    • 2020-03-29
    相关资源
    最近更新 更多