我想了解Rampion's code中xargs man
的使用情况:
screen -t man /bin/sh -c 'xargs man || read'
感谢Rampion:我们不需要猫!
为什么我们在命令中需要xargs
?
我理解xargs
-part如下
我有一个想法,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, ...
答案 0 :(得分:4)
不,我没有cat
没有。我在运行命令后得到了任何输入。 cat
在这里实际上是无关紧要的,所以让我们忽略它。
xargs man
等待用户输入。这是必要的。因为你在脚本中抓住了它,所以在创建窗口之前我不能粘贴man的参数。因此,在窗口中运行的命令需要等待我给它一些东西,然后再尝试运行man。
如果我们刚刚运行screen /bin/sh -d 'man || read'
,它会一直抱怨“您想要哪个手册页?”因为我们从来没有告诉它。
答案 1 :(得分:3)
xargs从stdin收集参数并执行用这些参数给出的命令。
因此cat正在等待输入的内容,然后xargs正在运行带有该输入的人。
如果要处理大量文件,xargs很有用,我经常将它与find的输出一起使用。 xargs将尽可能多的参数填充到命令行中 这对于做像
这样的事情很棒find . -name '*.o' -print | xargs rm
答案 2 :(得分:3)
cat
命令无法运行;它在标准输入上运行,直到它被告知输入结束。正如Rampion指出的那样,cat
命令在这里不是必需的,但它是在其隐式输入(标准输入)上运行,而不是在任何情况下运行。
xargs
命令从cat
读取输出,并将信息分组为man
命令的参数,并将其指定为(仅)参数。当它达到限制(在命令行上可配置)时,它将执行man
命令。
find ... -print0 | xargs -0 ...
成语处理包含空白字符(如空格,制表符和换行符)的文件名。 find
命令打印每个文件名,后跟ASCII NUL('\0'
);这是两个不能出现在简单文件名中的字符之一 - 另一个是'/'(当然,它出现在路径名中,但不是简单的文件名)。它不直接等同于您提供的序列; xargs
将文件名集合分组到单个参数列表中,最大为大小限制。如果名称足够短(通常是),那么grep
的执行次数将少于文件名。
另请注意,grep
仅打印找到材料的文件名(如果有多个要搜索的文件),或者它是否支持选项以便始终打印文件名和使用选项:'-H
'是grep
的GNU扩展,可以执行此操作。确保始终显示文件名的可移植方法是将/dev/null
列为第一个文件(所以'xargs grep something /dev/null
');搜索/dev/null
不需要很长时间。