rpm -qa > file | wc -l
返回 0。我做错了什么?我认为我的目标很明确,但不起作用。这是xargs
or的工作吗tee
?
答案1
答案2
是的,这是 T 恤的工作:
rpm -qa | tee file | wc -l
在此结构中,a | b
a 的标准输出转到 b 的标准输入。如果a > file | b
所有输出形式 a 都进入文件,而没有任何内容进入 b 标准输入。tee
命令将其在标准输入上接收到的所有内容复制到文件和标准输出中。
答案3
rpm -qa > file ; wc -l file
应该做你想做的事。
答案4
在任何与 Bourne 或 POSIX 兼容的 shell 中,重定向都是从左到右处理的,并且管道首先出现。因此你的命令是这样执行的(我省略了子进程 2 中发生的事情):
- 创建一个管道。
- fork 两个子进程 1 和 2。
- 将标准输出 1 重定向到管道。
- 将标准输出 1 重定向到
file
. - 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