一、用于重定向的运算符
> 输出重定向到一个文件或设备 覆盖原来的文件
>! 输出重定向到一个文件或设备 强制覆盖原来的文件
>> 输出重定向到一个文件或设备 追加原来的文件
< 输入重定向到一个程序
几点说明:
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 当中。错误与正确文件输出到同一个文件中
将显示的数据,正确的输出到 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 的输出关闭;