Linux多命令协作:管道、重定向
感谢Linuxcast,感谢苏勇(nash_su)老师!
不要重复发明轮子
开源文化的核心理念之一就是不要重复发明轮子,很多的开源软件都是现有软件、代码、功能的重新组合,就好像通过零件装配机器一样,源代码的开放和共享让这成为了可能,同时也大大提高了效率和生产力。
管道和重定向
在Linux系统中,大多数命令都很简单,很少出现复杂功能的命令,每个命令往往只实现一个或者几个很简单的功能,我们可以通过将不同的功能的命令组合在一起使用,以达到完成某个复杂功能的目的。
Linux下,几乎所有命令的返回数据都是纯文本的(因为命令都是运行在CLI下),而纯文本形式的数据又是大多数命令的输入格式,这就让多命令协作成为可能。
Linux的命令行为我们提供了管道和重定向机制,多命令协作就是通过管道和重定向完成的。
命令行shell的数据流有以下定义:
命令通过STDIN接收参数或数据,通过STDOUT输出结果或通过STDERR输出错误。
通过管道和重定向我们可以控制CLI的数据流。
示例:
上图中可以看到,命令的返回结果存到了文件中,而且新的返回信息会覆盖旧的信息。
这个我们可以看到,命令的返回结果也是保存在文件当中,而且新的返回结果追加到原来文件的结尾,而没有覆盖掉。
上图中输出的错误信息,通过2>
保存在文件中,而且也是覆盖。这样做文件会只保存输出的错误信息,正常的输出结果不会显示,所以我们借此实现错误日志的功能。
而如果我们既想保存命令的正常结果,又想保存错误的结果,我们可以使用2>&|
,这里就不在以具体的实例展示了。
上图中,我们重定向了输入流,将/etc/passwd文件的内容传给前面的命令,实现了查找/etc/passwd文件中哪一行含有关键字“veeja”的功能。
而在实际应用中,我们用的最多的其实是管道“|”,借此我们可以实现多命令协作的功能。
比如以下这两个实例:
我们将第一个命令的输出结果作为第二个命令的输入,实现了查找ls -l
命令列出的文本中含有关键字veeja的一行,并将其列出。
上面的例子中,我们查找根分区下所有用户为“veeja”的文件,并查找其中文件名包含Video的文件,我们可以看到,命令输出了大量的错误信息,所以我们做一些改进,我们将这些错误的信息进行重定向,我们把它重定向到/dev/null中,所有被重定向到/dev/null的信息都会被丢弃。我们重新运行这个命令:
可以看到我们预期的结果。
总结
- 管道通常用来组合不同的命令,以实现一个复杂的功能。
- 重定向通常用来保存某命令的输出信息或错误信息,可以用来记录执行结果或保存错误信息到一个指定的文件中。
That’s all.
环境:
软件版本:VirtualBox 4.3.12 r93733
Linux系统版本:CentOS 7 ×86_64 1511
如有纰漏,望不吝指出,不胜感激。