Linux下的重定向

来源:互联网 发布:行情数据接口 编辑:程序博客网 时间:2024/05/20 12:25

一、用于重定向的运算符

>               输出重定向到一个文件或设备 覆盖原来的文件
>!              输出重定向到一个文件或设备 强制覆盖原来的文件
>>             输出重定向到一个文件或设备 追加原来的文件
<               输入重定向到一个程序

几点说明:

1、进程自动关联3个fd,其中0表示标准输入,默认与keyboard关联;1表示标准输出,与monintor关联;2表示标准错误,与moninto关联。fcntl.h中为上述三个fd定义了宏。分别是STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO;

2、使用上述运算符时,其左侧为fd(文件描述符),右侧为重定向到的对象,例如文件路径,其他描述符等。对于>来所,可以省略左边的1(即>file 等价与 1>file),对于<来说,可以省略左边的0(即<file 等价与 0<file);

3、如果要将fd1重定向到fd2,应在fd前家“&”,即应使用fd1>&fd2(或者fd1<&fd2)。目的是避免与名称为fd2的文件混淆;

二、基本用例

[test @test test]# ls -al > list.txt
将显示的结果输出到 list.txt 文件中,若该文件以存在则予以取代;


[test @test test]# ls -al >> list.txt
将显示的结果累加到 list.txt 文件中,该文件为累加的,旧数据保留;


[test @test test]# ls -al  1> list.txt   2> list.err
将显示的数据,正确的输出到 list.txt 错误的数据输出到 list.err


[test @test test]# ls -al 1> list.txt 2> &1
将显示的数据,不论正确或错误均输出到 list.txt 当中。错误与正确文件输出到同一个文件中

[test @test test]# ls -al 1> list.txt 2> /dev/null
将显示的数据,正确的输出到 list.txt 错误的数据则予以丢弃。 /dev/null ,可以说成是黑洞装置。为空,即不保存。

三、cmd >file 2>&1与cmd 2>&1 >file的区别

分析:

0代表标准输入,1代表标准输出,2代表标准错误输出。其中1(即> = 1>)可以省略,默认为标准输出。

(1)首先把cmd的标准输出重定向到file文件中去。然后把2>&1,就把标准错误输出重定向到标准输出中去。由于此时的标准输出已经重定向了,相当于把标准输出与标准错误输出都一起重定向到file中去。 &1代表的是标准输出的文件描述符,用&s是为了区分一下,表示标准输出的文件描述符而不是名称为1的文件。

(2)首先把标准错误输出重定向到标准输出中,此时标准输出还在终端,因此标准错误也在终端。然后标准输出重定向到file中去了。而标准错误还是在终端。

因此,(1)表示标准输出与标准错误都到file中去了。

            (2)表示标准输出到file,但标准错误输出仍然在终端。

四、进阶讲解

  cmd >> file 2>&1  把 stderr 和 stderr 一起重定向到 file 文件中(追加);
  cmd < file >file2    cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout;
  cmd  n<>file           以读写的方式打开 file,fd为n,且cmd的输入数据均定向为file;


  >&n                        使用系统调用 dup (2) 复制文件描述符 n ,并把结果用作标准输出(即标准输出重定向到fd为n的文件);
  <&n                        标准输入重定向到 n;
  <&-                         关闭标准输入(键盘);
  >&-                         关闭标准输出;
  上述所有形式都可以前导一个数字,此时建立的文件描述符由这个数字指定而不是缺省的 0 或 1。例如

        n<&-                      表示将fd为 n 的输入关闭;
  n>&-                      表示将 fd为 n 的输出关闭; 

0 0
原创粉丝点击