将一个命令的输出用作另一个命令的输入

|

Unix是由一些小片段松散连接在一起的,这是句真理。除了管道(pipe)的概念,没有什么比它更能体现这一原则了。管道就是键盘上的“|”符号,当把它放在两个命令之间时,它可以将第一个命令的输出作为第二个命令的输入。换句话说,|重定向stdout,将它发送到第二个命令的stdin。

下面用一个简单的例子来帮助你更好地理解这个概念。ls命令是我们早已知道的。现在只需要知道less命令能够让用户在屏幕一次查看文本文件的一页。如果在包含很多文件的目录上运行ls命令,例如/usr/bin,显示内容就会因为速度太快而不能阅读。但是如果将ls命令的输出通过管道发送给less命令,就可以在屏幕以一次阅读一页的方式来查看结果了。

$ pwd
/usr/bin
$ ls -1

zipinfo
zipnote
zipsplit
zsoelim
zxpdf
[Listing truncated due to length - 2318 lines!]
$ ls -1 | less
411toppm
7z
7za
822-date
a2p

通过管道将ls -1的结果传递给less,就可以一次在屏幕上只查看结果的一页,这样用起来要容易得多。

接下来是一个更高级的例子,使用命令ps和grep。ps命令能够列出正在运行的进程;grep命令可以用它查找文件中与指定模式相匹配的行。假设Firefox运行异常,你怀疑后台仍旧有多个Firefox程序的副本在运行。ps命令会列出计算机中正在运行的所有进程,但是输出的结果总是很长,而且还在不断地变化。如果将ps的输出通过管道传递给grep命令,让它去搜索firefox,这样,Firefox确实还在运行的话,你就能够马上做出判断了。

说明 为了节约篇幅,在以下代码中删除了所有者的信息,每个实例的所有者都是同一个用户。

$ ps ux
1504  0.8  4.4  75164 46124 ? S Nov20 1:19 kontact
19003  0.0  0.1   3376  1812 pts/4 S+ 00:02 0:00 ssh
➥admin@david.hartley.com
21176  0.0  0.0      0    0 ? Z 00:14 0:00
➥[wine-preloader] <defunct>
24953  0.4  3.3  51856  34140 ? S 00:33 0:08 kdeinit:
➥kword /home/scott/documents/clientele/current
[Listing truncated for length]
$ ps ux | grep firefox
scott  8272  4.7 10.9 184072 112704 ? Sl Nov19 76:45
➥/opt/firefox/firefox-bin

将原本有58行的输出结果变成了一行,现在读起来容易多了。

说明 要记住,虽然很多程序都能够用管道,但并非所有程序都如此。例如,文本编辑器vim(或pico、nano及emacs)会接管整个shell,因此,键盘的所有输入都直接发送给vim,而所有输出都在程序的某个位置进行显示。因为vim完全控制着shell,所以也就不能使用程序通过管道重定向它的输出。多使用几次shell,你就能逐渐学会如何识别不能使用管道的程序了。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hamilton_Huan

原创不易,结合业务原创更不易

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值