九:输入与输出,重定向

目前我们用到的大多数命令都是有输入和输出的,这不难理解,一个命令可能需要得到一个用户指定的参数去执行,然后把执行的结果反馈给用户。当然,这个命令可能不需要人为的指定要输入的参数,会自带默认的参数,比如:pwd;也许,命令给出的信息不是理想的结果,比如ls一个不存在的目录或者文件,命令给出了错误提示。
以上种种,都是程序所涉及的输入与输出常见途径。就输入而言,很多程序都从一个叫标准输入的设备得到输入信息,不难想到,这个设备就是我们的键盘,命令行下大多数操作都是通过键盘完成。而输出分为两种,标准输出和标准错误,通常,这两个输出都会直接连接到屏幕,而不是保存到磁盘文件

标准输出:


标准错误:


重定向,就是允许我们自己重新确定输入和输出信息的流向。
要实现重定向,我们需要用到重定向符“>”,这个符号很形象,像沙漏一样,可以理解为从什么到什么。
以往,我们使用“ls -l /”,会将程序的结果输出到屏幕上,现在,我们使用重定向,将这个结果保存到一个文件中。“ls -l / > /testls.txt”,使用“>”,把程序的输出结果,从标准输出(屏幕)重定向到指定的文件。

*之前提到过,“touch”命令是新建文件的一种手段,现在,我们知道了帮助命令,我们可以得知,“touch”命令的本来作用是更新目标文件的访问和修改时间为当前时间,当目标文件不存在时才会新建一个以目标文件命名的文件,在重定向中,我们指定的重定向目标文件不存在时,也会新建一个文件。这也是新增文件的一种手段。可以说,当有输出发生的时候,目标文件不存在,那么会新增一个文件。

文件查看命令:cat
cat命令的作用是连接到一个文件,并把文件内容输出到标准输出
好了,我们查看一下刚才重定向的文件
示例:cat /testls.txt
呃,并没有高亮显示来区别文件内容,毕竟不是“ls”命令有高亮显示,保存的只是纯文本信息。

我们再尝试一下重定向错误信息到testls.txt文件

文件之前保存的内容也不见了!之所以会这样,是因为我们只指定了标准输出的重定向,但是标准输出因为错误而中断了(目标文件不存在,所以压根没有输出),所以标准输出没有任何内容。

*所以直接使用重定向符号“> something.txt”会直接创建一个空文件,或者清空同名文件的内容

重定向追加操作符“>>”
当我们把“ls -l / > /testls.txt”改为“ls -l / >> /testls.txt”,那么意味着,如果目标文件不存在,会新建一个目标文件,并将标准输出输出到该文件,如果存在,那么会将标准输出追加到该文件的尾部。

重定向标准错误
为了能使用重定向错误,我们需要先知道,Linux在执行一个程序的时候会打开多个流,我们把前三个看做标准输入,标准输出,标准错误,他们在shell中有各自的文件描述符(可以理解为流编号),分别是0,1,2,当我们使用“>”重定向标准输出时,我们实际上是重定向了文件描述符为1的流,也就是说
“ls . > a.txt”等同于”ls . 1> a.txt”

那么重定向标准错误也就是
“ls null 2> a.txt”
假定null是一个不存在的文件,命令执行之后,产生的错误信息会重定向到你指定的文件。

还可以使用“>&”(或者“&>”)来把标准输出和标准错误都重定向到一个位置
“ls null >& a.txt”

这样,两种输出信息都会写到a.txt中。这是一种联合的写法,可以更具体去写
“ls null > a.txt 2>&1“重定向标准输出到a.txt文件,然后重定向标准错误到标准输出。这里要注意顺序,需要先重定向标准输出,再重定向标准错误,如果顺序反过来,那么标准错误会重定向到屏幕。

为了能更好的了解这些数字所对应输入输出的关系,我们进一步来说明一下。在Linux中,一切皆文件,设备也是如此,我们查看一下设备挂载点

其中我们看到,有stderr,stdin,stdout三个软连接,他们分别指向了proc挂载点下的三个文件,在这里,我们其实已经能找到文件描述符和输入输出的对应关系,文件描述符0,1,2都指向了同一个设备/dev/pts/0,这个设备中前三个流我们使用文件描述符0,1,2来规定为标准输入,输出和错误。这里额外说一句,为什么文件描述符会指向/dev/pts/0这个设备呢,因为演示的时候是使用的装有Xwindow图形界面的Linux,我们是在使用一个叫终端控制台的东西在和shell进行交互,在这种情况下,/dev/pts/n(n代表序号,0代表当前终端,1代表第一个,2代表第二个,以此类推)是在Xwindow模式下的伪终端。如果在纯Shell环境下,我们使用的设备将不是/dev/pts/n,而是/dev/tty1。关于终端的更多信息,可以自行查阅。

Xwindow:


Shell:


重定向标准输入
刚才我们使用了cat命令,cat命令的标准输入是什么呢?之前我们指定了一个文件作为cat命令的标准输入,倘若不指定文件呢?

我们发现命令行正在等待我们的输入,是的,我们没有指定文件作为cat的标准输入,所以cat就查找默认的标准输入:键盘,我们输入一段字符,按下“ctrl+d”来通知cat已经完成写入,按下回车,我们刚才键入的文字出现在了屏幕上。
好了,重定向的功能已经实现了,不是么,但是这里我们并没有使用重定向符号”>”,对于cat命令,我们可以
cat < someText.txt 来重定向cat的标准输入
*”<“和“>”,还有”>>”都可以重定向

Linux里的黑洞,神话中的貔貅,/dev/null文件
我想已经能够很清楚的描述/dev/null的作用了,首先/dev/null是一个文件,通过文献,也可以得知他叫“位存储桶”,他能处理掉任何写入他的信息,换言之,写入后不作任何处理。如果我们重定向输出到位存储桶,那么他既不会存储,也不会输出,但是会提示写入成功。用来处理异常信息是个不错的选择。

连接命令间的输入与输出,管道线
管道线,写作“|”,对,很形象,作用也很形象,就是连接命令之间的输入和输出。
示例:
“ls -l / | cat”,加不加管道线联合cat都会在屏幕上输出,虽然在这里,管道线看上去没什么作用,但是再看下面这个例子
“ps -ef|grep XXX”,简而言之就是,找到我们所需的进程,ps命令执行之后会在屏幕上展示当前所有进程,通过管道线,将这个输出作为grep命令的输入,找到匹配我们给定字符的行并在屏幕上展示

posted on 2015-06-27 15:24 都较瘦 阅读(150) 评论(0)  编辑  收藏 所属分类: Linux


只有注册用户登录后才能发表评论。


网站导航:
 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

公告

博客定位:囿于目前的水平,博客定位在记录自己的学习心得和随手的练习

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜