重定向(redirection)
所谓的重定向可以简单的理解为重新指定输入输出的方向,既然是重新制定输入输出的方向,那么原来的输入输出方向是如何的呢?
计算机的I/O有标准输入、标准输出、输出错误,默认的标准输入是与键盘相连接的,标准输出是与屏幕相连接的,至于输出错误也是默认连接到屏幕。
而I/O重定向可以允许我们更改这些默认连接,从文件中读取内容,将输出写入到文件等等,都是重定向。
1.重定向标准输入
ls命令默认将输出连接到屏幕,我们可以通过>重定向操作符改变输出
ls > ls-output.txt
这样ls将要输出的内容就输出到了ls-output.txt文件中
不过下次再向这个文件中重定向时文件内容就会被重写覆盖,当然,我们可以通过使用>>重定向运算符解决这一问题
ls >> ls-out.txt
ls输出的内容就会在原文件末尾添加
注意:重定向的内容自动换行
2.重定向标准输入
在介绍标准输入重定向之前,先来复习复习cat这个命令
之前,一直只是知道cat用来显示较短的文件的内容,却没有发现它的一个很有用的地方,cat可以用来打开多个文件显示,我们有时候会下载一个文件包,然而里面的文本会被分成好多部分,text1,text2…,这时候一个一个查看是很费劲的,我们会想有没有一个东西将这些文本连接起来组成一个文件呢?告诉你,cat就可以做到
cat text1 text2…
这时候cat连接文件还是默认输出到屏幕,怎么将输出重定向到一个文件呢,当然需要用到>运算符
cat text1 text2… > text
这样所有的内容就都在text文件中了。
我们想一想,如果cat不带参数会怎么样?
cat
这时候cat会等待标准输入,默认的标准输入是键盘,敲击几个字符,然后按下Ctrl-D(end of file),屏幕上会输出你敲击的字符。
这是很容易明白的,标准输入连接键盘,标准输出连接屏幕。
那么怎么改变标准输入的连接呢?这时候就需要<运算符了
cat < filename
这样cat就不会等待键盘的标准输入了,因为cat已经从filename中读取到内容了,当然因为标准输出没有发生变化,filename的内容是会被显示到屏幕中的
cat <filename >filename1
这样filename的内容就会被写入到filename1中了,好像并没有什么意义呢。
发现了没有,我们是不是可以将cat filename理解成省略了<呢?
3.重定向输出错误
既然有<运算符,也有>运算符,难道重定向输出错误用的是<>
当然不是
其实在程序向文件流中写入文件时,对“前三条流做”编号,叫做文件描述符(file descriptor),0、1、2分别表示标准输入、标准输出、输出错误,这样在使用>运算符是我们可以显式的“指定输出的流了”。
lss 2> error-output.txt
这时就会把命令错误信息写入到error-output.txt文件中,(lss命令找不到啊),千万别指望lss 1>l-output.txt文件中,因为1指定的是“标准输出流”。
如果既把标准输出又把输出错误写入到文件该怎么办呢?
ls >ls-output.txt 2>&1
注意不要这样
ls 2>&1 >ls-output.txt
因为先把“2流”输出重定向到“1流”,“1流”默认的标准输出连接为屏幕啊,这是如果发生错误,标准错误是会被显示在屏幕上的。
其实有一种更简单的方式:
ls &> ls-output.txt
这样就方便了许多。
4.介绍几个简单的命令和操作符
管道操作符|
|可以将一个命令的标准输出作为另一个命令的标准输入
ls | less
将ls的标准输出通过管道作为less的标准输入
过滤器
sort对输出内容的行进行排序
cat test | sort
wc 打印行,字和字节数
wc filename
grep打印匹配行
grep从文本中搜索匹配行,并打印出来
grep hello test
从test文件中搜索含有hello的行,并将其打印出来
-i选项,忽略搜索的大小写
-v选项,输出不行匹配项的行
tee
接受标准输入,同时输出到标准输出和文件
who |tee who-output.txt
将who的内容显示在屏幕上(标准输出),并输出到who-output.txt文件中