首页 技术 正文
技术 2022年11月14日
0 收藏 753 点赞 2,675 浏览 2863 个字

  首先说一下什么是数据流重定向,所谓数据流重定向简单来说就是一个过程,这个过程捕捉一个文件,或者命令,程序,脚本,甚至脚本中的代码块(code block)的输出,然后把捕捉到的输出,作为输入发送给另外一个文件,命令,程序,或者脚本。

  谈到数据流重定向,我们首先需要了解文件描述符的概念。对于linux内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程等返回一个文件描述符。按照惯例,unix系统shell把文件描述符0与进程的标准输入关联,文件描述符1与标准输出关联,文件描述符2与标准错误关联。总结如下:

  标准输入:文件描述符0,通常指键盘的输入 。使用符号<或<<
  标准输出:文件描述符1,通常指命令执行所回传的正确信息 ,默认输出到屏幕u。使用符号>或>>
  标准错误:文件描述符2,通常指命令执行失败后,所回传的信息,也是默认输出到屏幕。试用符号2>或2>>

  默认情况下>和>>分别表示1>或1>>,<和<<与0<和0<<等价。

标准输出重定向: 

  #ls

  表示列出当前目录条目,并将结果输出到屏幕。

  #ls 1>file1

  以上命令会把命令的标准输出重新定向到一个文件file,而不是显示到屏幕上,如果不指明文件标识符,系统默认的就是1, 因此1可以省略。

即这个命令等同于

  #ls >file1

  如果file1不存在,则系统会自动创建。如果已经存在,那么系统首先会把这个文件清空,然后再将数据写入该文件。也就是说>输出到一个已存在的文件,那么会覆盖这个文件。如果不想覆盖,可以使用>>。表示将重定向数据追加到file1文件的末尾。

标准错误重定向:

  #ls -qw 2>errorfile

  表示将错误信息不输出到屏幕,而是写入errorfile。注意这里的2不能省略。因为>与1>等同,默认是标准输出重定向。所以这里要写成2>,表示标准错误重定向。-qw用来产生错误信息。

把标准错误和标准输出写入同一个文件:

  #./a.out &>outfile

  这个命令把./a.out的标准输出和标准错误重定向到outfile。&在这里表示标准错误和标准输出。下面是另一种写法:

  #./a.out > outfile  2>&1

  

  下面是一个错误的例子:

  #./a.out > outfile 2>outfile

标准输入重定向:

  #grep search-world <filename 或 grep search-world 0<filename

  

  还有下面这种方式:

  cat > catfile < ~/.bashrc

  它代表将~/.bashrc的内容作为输入,然后将这些内容写入catfile

关闭文件:

  “&-“表示关闭文件标识符

  有关关闭文件标识符的操作请参考下面

n<&- 关闭输入文件标识符n
0<&-或<&- 关闭标准输入stdin
n>&- 关闭输出文件标识符n
1>&-或>&-关闭标准输出stdout

  

屏蔽标准输出或标准错误:

  ./a.out  > /dev/null      #等同于./a.out 1>dev/null 表示屏蔽标准输出

  ./a.out  2>/dev/null     #表示屏蔽标准错误

  ./a.out > /dev/null 2>/dev/null    #表示同时屏蔽标准输出和标准错误

打开文件:

#exec 3<>filename           把文件filename打开,并指定文件标识符为3

  命令j<>filename表示把文件打开,并指明文件标识符为j

我们什么时候需要重定向:

  1.屏幕输出的信息很重要,而且我们需要将它存下来的时候。

  2. 后台执行中的程序,不希望它干扰屏幕正常的输出结果时。

  3. 一些系统的例行命令。(例如写在/etc/crontab中的文件)的执行结果时,希望它可以存下来。

  4. 一些执行命令的可能已知错误信息时,想以“2>dev/null”将它丢掉

  5. 错误信息与正确信息需要分别输出时

常用重定向命令:

  cmd > file 把 stdout 重定向到 file 文件中;

  cmd >> file 把 stdout 重定向到 file 文件中(追加);

  cmd 1> fiel 把 stdout 重定向到 file 文件中;

  cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中;

  cmd 2> file 把 stderr 重定向到 file 文件中;

  cmd 2>> file 把 stderr 重定向到 file 文件中(追加);

  cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file 文件中(追加);

  cmd < file >file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout;

  cat <>file 以读写的方式打开 file;

  cmd < file cmd 命令以 file 文件作为 stdin;

  cmd << delimiter Here document,从 stdin 中读入,直至遇到 delimiter 分界符。

  >&n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出;

  <&n 标准输入复制自文件描述符 n;

  <&- 关闭标准输入(键盘);

  >&- 关闭标准输出;

  n<&- 表示将 n 号输入关闭;

  n>&- 表示将 n 号输出关闭;

与重定向相关的题目:

  此题来自《unix环境高级编程》(第3版)P73 3.5

  在Bourne shell、Bourne-again shell 和Korn shell中,digit1>&digit2表示将描述符digit1的重定向至描述符digit2的同一文件。请说明下面两条命令的区别。

  ./a.out > outfile 2>&1

  ./a.out 2>&1 >outfile

  

  答:因为shell从左到右处理命令行,所以:

  ./a.out > outfile 2>&1 等同于./a.out  1>outfile 2>&1

  首先执行 >outfile 设置标准输出到outfile,然后执行2>&1,即调用dup将标准输出复制到描述符2(标准错误上),其结果是将标准输出和标准错误设置为同一个文件,即描述符1和2指向同一个文件表项。而对于命令行

  ./a.out 2>&1 >outfile
  首先执行dup,所以描述符2成为终端(假设命令是交互执行的),标准输出重定向到outfile。结果是描述符1指向outfile的文件表项,描述符2指向终端的文件表项。

参考资料:

  1.http://os.51cto.com/art/201003/187688.htm

  2.http://blog.csdn.net/ljianhui/article/details/9262737

  3.https://www.ibm.com/developerworks/cn/linux/l-iotips/

  4.《unix环境高级编程》

命令j<>filename表示把文件打开,并指明文件标识符为j

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,088
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,565
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,413
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,186
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,822
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905