简介

我们都知道 shell 使用管道将一个程序的标准输出传进另一个程序的标准输入, 据此我们可以像搭积木一样把程序拼起来.

但是还是有很多程序不接受标准输入里的数据,比如 echo, 如果运行:

cat "文件路径" | echo

最后什么也不会得到.

千万不要以为这样的命令很少,几个常用的命令 rm, ls, mkdir, cp 都不会搭理标准输入的东西.

哪怕是那些愿意从标准输入流读取数据的程序, 它们愿意读的内容和你想要传入的内容也不一定相同。比如说命令选项和取值, 有任何一个命令能同情达理到读这些吗?

针对以上种种问题,xargs 应运而生。它的工作很简单: 把标准输入的内容按照要求划分成一个或多个命令的参数, 拼接到给定的命令后面,假装执行的是拼接后的命令.

cat "文件路径" | xargs echo

就会看到输出了.

其实连 echo 都可以不要,xargs 默认执行.

性质

上面已经演示了 xargs 的基本使用方法了. 注意 xargs 会将标准输入里的内容用单引号括起来传进去, 因此不要指望进行各种替换.

默认情况下,xargs 用空白字符把输入分割成多个参数.

选项

  • -d 分割符:使用其它 分割符.
  • -p: 打印将要执行的命令并请用户确认是否继续执行.
  • -t: 打印并执行命令.
  • -0: 使用 null 当分割符.
  • -L 行数:指定多少行作为一个命令的参数, 每个命令的参数都会单独执行一遍命令.
  • -n 项数:指定一行多少项作为一个命令的参数.
  • -I 替换字符串:在要执行的命令中把 替换字符串 替换成参数. 自动使用 -L 1 选项 例: args -I 参数 sh -c 'echo 参数; mkdir 参数' 会把后面的两个 参数 替换成标准输入 中的参数.
  • --max-procs 进程数:如果命令不止执行一遍,指定开多少个进程执行, 0 代表不限制.