3

我想了解Rampion 代码xargs man中的用法:

screen -t man /bin/sh -c 'xargs man || read'

感谢 Rampion:我们不需要猫!

为什么我们需要xargs在命令中?

我对xargs-part 的理解如下

  1. 猫对 xargs 没什么
  2. xargs 列出 man 命令

我有一个想法,即 xargs 列出了命令。例如,

find . -type f -print0 | xargs -0 grep masi 

与命令列表相同:

find fileA AND grep masi in it 
find fileB AND grep masi in it 
           and so on for fileC, fileD, ...
4

3 回答 3

4

不,我什么都cat没有。运行命令后,我会收集任何输入。 cat这里实际上是无关的,所以让我们忽略它。

xargs man等待用户输入。这是必要的。由于在您从中获取的脚本中,我无法粘贴 man 的参数,直到创建窗口之后。因此,在窗口中运行的命令需要等待我给它一些东西,然后它才会尝试运行 man。

如果我们只是运行screen /bin/sh -d 'man || read',它总是会抱怨“你想要什么手册页?” 因为我们从来没有告诉过它。

于 2009-07-13T20:18:16.743 回答
3

xargs 从标准输入收集参数并执行带有这些参数的命令。

所以 cat 正在等待输入某些内容,然后 xargs 正在使用该输入运行 man 。

如果您有很多文件要处理,xargs 很有用,我经常将它与 find 的输出一起使用。xargs 会将尽可能多的参数填充到命令行中。
非常适合做类似的事情

find . -name '*.o' -print | xargs rm
于 2009-07-13T20:31:11.490 回答
3

cat命令不会对任何内容进行操作;它在标准输入上运行,直到被告知输入结束。正如 Rampion 所指出的,该cat命令在这里不是必需的,但它在其隐式输入(标准输入)上运行,而不是在任何东西上运行。

xargs命令从 读取输出cat,并将信息分组为man指定为其(唯一)参数的命令的参数。当它达到限制(可在命令行上配置)时,它将执行man命令。

find ... -print0 | xargs -0 ...成语处理包含尴尬字符的文件名,例如空格、制表符和换行符。该find命令打印每个文件名,后跟一个 ASCII NUL ( '\0');这是不能出现在简单文件名中的两个字符之一 - 另一个是“/”(当然,它出现在路径名中,但不出现在简单文件名中)。它不直接等同于您提供的序列;xargs将文件名集合分组到单个参数列表中,最大大小限制。如果名称足够短(通常是),那么执行的次数将少于grep文件名。

还要注意,grep如果要搜索多个文件,或者如果它支持一个选项以便它始终打印文件名并使用该选项,则仅打印找到该材料的文件名:' -H'是对此的 GNU 扩展就是grep这样做的。确保文件名始终出现的可移植方式是/dev/null作为第一个文件列出(所以 ' xargs grep something /dev/null');搜索时间不长/dev/null

于 2009-07-13T20:39:34.920 回答