输出重定向,与输入重定向

Ken Thompson 曾经就如何设计简洁而高效的操作系统提出过一个原则,
就是我们现在奉为圭臬的 Unix 程序设计准则(Unix Philosophy):“一次只
做一件事,并做到最好(Do one thing and do itwell)”。 Linux 作为一种类
Unix 操作系统也秉承了这个准则。如果仔细回想一下,我们会发现我们前面所
提到过的各种 Linux 程序(命令)无不体现了这个准则:这些程序大多目的明
确专一,并且往往能够又快又好地达成目标。
Doug McIlroy 将 Unix 准则扩展并归纳如下,一个好的程序应该: a)一次
只做一件事,并做到最好; b)能够与其他程序协同工作; c)能够处理文本流。
(Write programs that doone thing and do it well. Write programs to work
together. Write programs tohandle text streams, because that is a universal
interface)。我们接下来要讨论的就是:如何有效地让 Linux 的程序协同工作。
其中主要涉及到如下两个主题:
 对命令的输入/输出文本流进行重定向(Redirection);
 将一个命令的输出通过管道(Pipes)连接到另一个命令的输入。
接下来,我们就对这两个主题进行一个详细阐述。
输入/输出文本流和重定向
所谓输入/输出文本流很容易理解,我们在“初次接触 Linux”的任务 1
中提到过, Linux 通过 Shell 与用户进行交互。而 Shell 正是使用输入流向程序
提供输入,常常指的是终端键盘;而用输出流在终端上显示程序输出,以前往
往指的是 ASCII 打字机或终端显示屏,现在一般是图形桌面上的窗口。
不过确切来说, Bash 实际上使用三种标准输入输出流:
 标准输出流(stdout),显示来自命令的输出,文件描述符是 1。
 标准错误输出流(stderr),显示来自命令的错误输出,文件描述符
是 2。

 

163559_cHkO_3127489.png163558_4dki_3127489.png163558_Qwm7_3127489.png163558_nIIu_3127489.png163559_cDaK_3127489.png163558_GPBc_3127489.png

163616_uA3o_3127489.png163616_4YIA_3127489.png163618_120s_3127489.png163615_18J5_3127489.png163614_IgwF_3127489.png163618_nNUa_3127489.png163614_YAty_3127489.png

163635_hPOQ_3127489.png163635_MD2B_3127489.png163635_PXso_3127489.png163635_y3bz_3127489.png163639_qGAi_3127489.png163636_ezXU_3127489.png163635_v6N3_3127489.png

163703_L0Jk_3127489.png163703_lO89_3127489.png163703_x8MM_3127489.png163706_pczf_3127489.png163706_SVhQ_3127489.png


 标准输入流(stdin),向命令提供输入,文件描述符是 0。
对于任何一条 linux 命令执行,它会是这样一个过程:
图 1 命令文本流
先有一个输入:输入可以从键盘或者其他输入设备,通过 stdin 交给命
令。命令执行完成:成功了,会把成功结果通过 stdout 输出到输出设备上:;
如果命令执行有错误:会把错误结果通过 stderr 也输出到屏幕上面。一般情况
下,我们可以将 stdout 和 stderr 视为终端屏幕或者终端窗口,而将 stdin 视为
终端键盘。

注意
 linux 文件描述符:可以理解为 linux 跟踪打开文件,
而分配的一个数字,这个数字有点类似 c 语言操作文件
时候的句柄,通过句柄就可以实现文件的读写操作。
 linux 启动后,会默认打开 3 个文件描述符,分别
是:标准输入 standard input 0,正确输出 standard out
put 1,错误输出: error output 2

这些默认的输出,输入都是默认,我们在使用过程中,有时候并不希望
执行结果输出到屏幕,例如我们想将结果输出到文件或其它设备或者简单丢
弃。这个时候我们就需要进行输出重定向了。简单来说,输出重定向指的就是
将某个程序默认指向 stdout 或者 stderr 的输出文本流转而指向另一个文件,也
即程序输出到某个指定文件中而不是输出到终端屏幕或者终端窗口中了。
重要
对输出进行重定向有两种方法:
 
 n> ,表示将来自文件描述符 n 的输出重定向到文
件。必须对这个文件有写权限。如果文件不存在,就创
建它。如果它存在,将覆盖原有文件内容;
 n>>,也表示将来自文件描述符 n 的输出重定向到文
件。同样,必须对这个文件有写权限。如果文件不存
在,就创建它。如果它存在,输出就附加到现有文件后
面。
其中, n> 或 n>> 中的 n 是指文件描述符。如果忽略,就假设是标准输
出。


有时候希望将标准输出和标准错误重定向到同一个文件中。自动化脚本或
后台作业常常采用这种做法,这样就能够在以后查看输出。可以使
用 &> 或 &>> 将标准输出和标准错误重定向到同一个位置。另一种方法是对文
件描述符 n 进行重定向,然后使用 m>&n 或 m>>&n 将文件描述符 m 重定向到
同一个位置。
对输出进行重定向的次序很重要。例如, command 2>&1>output.txt 与
command>output.txt 2>&1 不一样。
有时候希望完全忽略标准输出或标准错误。为此,可以把适当的流重定向
到 /dev/null 中。
而输出重定向则指的是让某个程序从指定文件中获取输入而非从 stdin 中
(常常指键盘)获取输入了。正如可以对标准输出流 stdout 和标准错误输出流
stderr 进行重定向,我们也可以使用 < 操作符将 stdin 重定向为来自文件。
Bash 还有 here-document 的概念,这是输入重定向的另一种形式。这使
用 << 以及一个单词(比如 EOF),这个单词作为输入结束的标志。

转载于:https://my.oschina.net/u/3127489/blog/1623722

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值