重定向和管道输出

重定向和管道输出

rpm -qa > file | wc -l返回 0。我做错了什么?我认为我的目标很明确,但不起作用。这是xargsor的工作吗tee

答案1

是的,这是一份工作tee

rpm -qa | tee file | wc -l

外壳重定向( >) 就是重定向,您一次只能将输出流指向另一个位置。|到那时就没有什么可看的了。tee就是为了这个目的而设计的,您希望将流分成两部分,一部分进入文件,一部分仍在标准输出上。上面的命令正是您想要做的。

xargs在这里没有帮助。

答案2

是的,这是 T 恤的工作:

rpm -qa | tee file | wc -l

在此结构中,a | ba 的标准输出转到 b 的标准输入。如果a > file | b所有输出形式 a 都进入文件,而没有任何内容进入 b 标准输入。tee命令将其在标准输入上接收到的所有内容复制到文件和标准输出中。

答案3

rpm -qa > file ; wc -l file

应该做你想做的事。

答案4

在任何与 Bourne 或 POSIX 兼容的 shell 中,重定向都是从左到右处理的,并且管道首先出现。因此你的命令是这样执行的(我省略了子进程 2 中发生的事情):

  1. 创建一个管道。
  2. fork 两个子进程 1 和 2。
  3. 将标准输出 1 重定向到管道。
  4. 将标准输出 1 重定向到file.
  5. 1、执行rpm -qa.

如果您希望子进程 1 的输出在两个通道(文件和管道)上复制,则必须有人完成制作数据的两个副本的工作。这正是tee目的。

rpm -qa | tee file | wc -l

Zsh 有一个内置的输出复制功能,称为多操作系统。在 zsh 中(并且仅在保留该选项的 zsh 中multios,不在 POSIX 兼容 shell 中,也不在 POSIX 之前的 Bourne shell 中,也不在 (t)csh 中),像您编写的那样的命令确实会复制数据两个输出重定向。

# in zsh
rpm -qa >file | wc -l

相关内容