Linux数据流重定向

在我们日常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

8、使用双向重定向命令(tee)将数据流同时输出到文件与屏幕 
这里写图片描述 
示例: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





猜你喜欢

转载自blog.csdn.net/weixin_39138071/article/details/80206085