在我们日常Linux命令操作中,命令执行的输入一般是键盘输入,输出一般是输出到屏幕,但有时候,我们可能会去读取文件里但数据作为输入,或者将输出保存到文件里(比如日志文件),这个时候就需要用到数据流重定向。
所谓数据流重定向,就是:1)将某个命令执行后应该要出现在屏幕上的数据传输到其它地方,例如文件或者诸如打印机之类的设备;2)将原本由键盘输入的数据改由文件内容来代替
标准输入(stdin):文件描述符0,通常指键盘的输入 。使用符号<或<<
标准输出(stdout):文件描述符1,通常指命令执行所回传的正确信息 ,默认输出到屏幕u。使用符号>或>>
标准错误(stderr):文件描述符2,通常指命令执行失败后,所回传的信息,也是默认输出到屏幕。试用符号2>或2>>
默认情况下>和>>分别表示1>或1>>,<和<<与0<和0<<等价
什么时候需要重定向:
1)屏幕输出的信息很重要,而且我们需要将它存下来的时候。
2)后台执行中的程序,不希望它干扰屏幕正常的输出结果时。
3)一些系统的例行命令。(例如写在/etc/crontab中的文件)的执行结果时,希望它可以存下来。
4)一些执行命令的可能已知错误信息时,想以“2>dev/null"将它丢掉
5)错误信息与正确信息需要分别输出时
1、标准输出重定向
#ls
表示列出当前目录条目,并将结果输出到屏幕。
#ls 1>file1
以上命令会把命令的标准输出重新定向到一个文件file,而不是显示到屏幕上,如果不指明文件标识符,系统默认的就是1, 因此1可以省略。
即这个命令等同于
#ls >file1
如果file1不存在,则系统会自动创建。如果已经存在,那么系统首先会把这个文件清空,然后再将数据写入该文件。也就是说>输出到一个已存在的文件,那么会覆盖这个文件。如果不想覆盖,可以使用>>。表示将重定向数据追加到file1文件的末尾。
2、标准错误重定向
#ls -qw 2>errorfile
表示将错误信息不输出到屏幕,而是写入errorfile。注意这里的2不能省略。因为>与1>等同,默认是标准输出重定向。所以这里要写成2>,表示标准错误重定向。-qw用来产生错误信息。
3、stderr、stdout分别重定向到不同的文件
#find /home -name .bashrc > list_right 2>list_error
此时屏幕上不会有任何信息显示,因为执行该命令以后,有permission的那几行错误信息会输出到list_error文件中,而正确信息会输出到list_right文件中
4、stderr、stdout写入同一个文件
#./a.out &>outfile
这个命令把./a.out的标准输出和标准错误重定向到outfile。&在这里表示标准错误和标准输出。下面是另一种写法:
#./a.out > outfile 2>&1
下面是一个错误的例子:
#./a.out > outfile 2>outfile //之所以错误是因为执行该命令时,两条数据可能交叉写入造成次序混乱,而另外两种写入方法则可避免该问题
5、屏蔽标准输出或标准错误
有时候我们不需要显示或者存储正确或错误信息时,可以屏蔽标准输出或标准错误:
./a.out > /dev/null #等同于./a.out 1>dev/null 表示屏蔽标准输出
./a.out 2>/dev/null #表示屏蔽标准错误
./a.out > /dev/null 2>/dev/null #表示同时屏蔽标准输出和标准错误
6、标准输入重定向
cat > catfile < ~/.bashrc
创建新文件catfile并用~/.bashrc中的内容作为catfile文件的内容
cat > catfile <<"eof"
在这里,则是将<<右侧的字符“eof”作为控制字符,用于终止输入,而不用键入ctrl+D来终止输入
7.使用tee
命令同时重定向到多个文件
经常你可能还有这样的需求,除了将需要将输出重定向到文件之外也需要将信息打印在终端,那么你可以使用tee
命令来实现:
$ echo 'hello shiyanlou' | tee hello
示例:last | tee test.list|cut -d’ ’ -f1
若加了 -a 则内容会加在文件之后,若无,则会重写该文件。
9、永久重定向
你应该可以看出我们前面的重定向操作都只是临时性的,即只对当前命令有效,那如何做到“永久”有效呢,比如在一个脚本中,你需要某一部分的命令的输出全部进行重定向,难道要让你在每个命令上面加上临时重定向的操作嘛,当然不需要,我们可以使用exec
命令实现“永久”重定向。exec
命令的作用是使用指定的命令替换当前的 Shell,及使用一个进程替换当前进程,或者指定新的重定向:
# 先开启一个子 Shell
$ zsh
# 使用exec替换当前进程的重定向,将标准输出重定向到一个文件
$ exec 1>somefile
# 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向(后面将告诉你怎么做)
$ ls
$ exit
$ cat somefile
参考:
《鸟哥的私房菜》
https://www.cnblogs.com/vincently/p/4641098.html
https://blog.csdn.net/jijerry/article/details/53535123