为了账号安全,请及时绑定邮箱和手机立即绑定

linux的重定向管道详解

标签:
Java Android Linux
重定向标准 I/O

Linux shell(比如 Bash)接收或发送序列和字符串流 形式的输入或输出。每个字符都独立于与之相邻的字符。字符没有被组织成结构化记录或固定大小的块。不管实际的字符串流进入或来自文件、键盘、显示窗口或其他 I/O 设备,都使用文件 I/O 技术来访问流。Linux shell 使用 3 种标准的 I/O 流,每种流都与一个文件描述符相关联:
stdout 是标准输出流,它显示来自命令的输出。它的文件描述符为 1。
stderr 是标准错误流,它显示来自命令的错误输出。它的文件描述符为 2。
stdin 是标准输入流,它为命令提供输入。它的文件描述符为 0。

重定向常用命令

cat - 连接文件

sort - 排序文本行

uniq - 报道或省略重复行

grep - 打印匹配行

wc - 打印文件中换行符,字,和字节个数

head - 输出文件第一部分

tail - 输出文件最后一部分

tee - 从标准输入读取数据,并同时写到标准输出和文件

标准输入,输出,和错误

到目前为止,我们用到的许多程序都会产生某种输出。这种输出,经常由两种类型组成。 第一,程序运行结果;这是说,程序要完成的功能。第二,我们得到状态和错误信息, 这些告诉我们程序进展。如果我们观察一个命令,像 ls,会看到它的运行结果和错误信息 显示在屏幕上。

与 Unix 主题“任何东西都是一个文件”保持一致,程序,比方说 ls,实际上把他们的运行结果 输送到一个叫做标准输出的特殊文件(经常用 stdout 表示),而它们的状态信息则送到另一个 叫做标准错误的文件(stderr)。默认情况下,标准输出和标准错误都连接到屏幕,而不是 保存到磁盘文件。除此之外,许多程序从一个叫做标准输入(stdin)的设备得到输入,默认情况下, 标准输入连接到键盘。

注意

I/O 重定向允许我们可以更改输出走向和输入来向。一般地,输出送到屏幕,输入来自键盘, 但是通过 I/O 重定向,我们可以改变输入输出方向。

重定向输出

可以通过两种方法将输出重定向到文件:

n>

ls -l /usr/bin > ls-output.txt

将输出从文件描述符 n 重定向到文件。您必须具有该文件的写权限。如果该文件不存在,将创建它。如果该文件已经存在,通常将覆盖所有现有内容,并且没有任何警告。\


n>>

ls -l /usr/bin >> ls-output.txt

还可以将输出从文件描述符 n 重定向到一个文件中。这里也一样要求您具有该文件的写权限。如果该文件不存在,将创建它。如果该文件已经存在,输出将附加到现有的内容后面。

重定向标准错误

重定向标准错误缺乏专用的重定向操作符。重定向标准错误,我们必须参考它的文件描述符。 一个程序可以在几个编号的文件流中的任一个上产生输出。然而我们必须把这些文件流的前 三个看作标准输入,输出和错误,shell 内部参考它们为文件描述符0,1和2,各自地。shell 提供 了一种表示法来重定向文件,使用文件描述符。因为标准错误和文件描述符2一样,我们用这种 表示法来重定向标准错误:

[me@linuxbox ~]$ ls -l /bin/usr 2> ls-error.txt
文件描述符”2”,紧挨着放在重定向操作符之前,来执行重定向标准错误到文件 ls-error.txt 任务。

重定向标准输出和错误到同一个文件
可能有这种情况,我们希望捕捉一个命令的所有输出到一个文件。为了完成这个,我们 必须同时重定向标准输出和标准错误。有两种方法来完成任务。第一个,传统的方法, 在旧版本 shell 中也有效:

输入重定向

[me@linuxbox ~]$ ls -l /bin/usr > ls-output.txt 2>&1

[me@linuxbox ~]$ cat < lazy_dog.txt

The quick brown fox jumped over the lazy dog.
使用“<”重定向操作符,我们把标准输入源从键盘改到文件 lazy_dog.tx。我们看到结果 和传递单个文件名作为参数的执行结果一样。把这和传递一个文件名参数作比较,不是特别有意义, 但它是用来说明把一个文件作为标准输入源。有其他的命令更好地利用了标准输入,我们不久将会看到。

管道线

命令可以从标准输入读取数据,然后再把数据输送到标准输出,命令的这种能力被 一个 shell 特性所利用,这个特性叫做管道线。使用管道操作符”|”(竖杠),一个命令的 标准输出可以管道到另一个命令的标准输入:

command1 | command2
为了全面地说明这个命令,我们需要一些命令。是否记得我们说过,我们已经知道有一个 命令接受标准输入?它是 less 命令。我们用 less 来一页一页地显示任何命令的输出,命令把 它的运行结果输送到标准输出:

[me@linuxbox ~]$ ls -l /usr/bin | less
这极其方便!使用这项技术,我们可以方便地检测会产生标准输出的任一命令的运行结果。

过滤器

管道线经常用来对数据完成复杂的操作。有可能会把几个命令放在一起组成一个管道线。 通常,以这种方式使用的命令被称为过滤器。过滤器接受输入,以某种方式改变它,然后 输出它。第一个我们想试验的过滤器是 sort。想象一下,我们想把目录/bin 和/usr/bin 中 的可执行程序都联合在一起,再把它们排序,然后浏览执行结果:

[me@linuxbox ~]$ ls /bin /usr/bin | sort | less

因为我们指定了两个目录(/bin 和/usr/bin),ls 命令的输出结果由有序列表组成, 各自针对一个目录。通过在管道线中包含 sort,我们改变输出数据,从而产生一个 有序列表。

重定向和管道的区别

重定向不管是输入和输出,都是把一个方向的输入和输出换成其他的形式,然而管道是把两个方向的输出和输入做一个转化。

点击查看更多内容
5人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
移动开发工程师
手记
粉丝
424
获赞与收藏
5663

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消