linux的重定向
1 文件描述符与标准输入(stdin),标准输出(stdout),标准错误(stderr)
内核用文件描述符来访问文件,文件描述符是非负整数,打开文件,新建文件,内核会返回一个文件描述符,读写文件也需要文件描述符来指定特定的文件。
stdin的文件描述符是0,stdout的文件描述符是1,stderr的文件描述符是2.在默认情况下stdin连接到键盘,stdout连接到屏幕,stderr连接到屏幕。
2 重定向
重定向就是改变stdin,stdout,stderr的默认连接位置。
3 stdout重定向
<1>stdout重定向需要使用‘>’后面连接文件,例如:
ls –l/home/tmp > xxx.txt
如果xxx.txt存在,此命令则擦除其内容并且将输出写到xxx中,如果xxx.txt不存在则新建一个并且输出写到xxx中。
<2>‘>>’跟‘>’的区别是‘>>’会把输出写到文件的末尾而不是覆盖原来的文件。例如:
ls –l /home/tmp >> xxx.txt
<3> ‘>’特性的巧妙利用
我们可以使用下面命令来新建一个xx.txt的空文本,利用的就是’>’的新建文件的功能。
>xx.txt
4 stderr的重定向
这个和stdout的重定向很类似,只不过在‘>’的左边多个一个文件描述符2,这个文件描述符就是标准错误的文件描述符。示例:
ls + 2>xxx.txt
从这里可以看出’>’的左边可以是1,2或者空,当是1或者空的时候表示要把stdout重定向;‘>’的右边是可以是&1,&2,或者文件名。
5 多次重定向
多次重定向中用的比较多的是就是将stdout和stderr都重定向到文件中,此时有两种方法:
ls+ >xx.txt 2>&1; //信息保存在xx.txt
ls+ &>xx.txt; //信息保存在xx.txt
一个更加多的重定向,例子如下:
xxx@LinuxDDD:/home/tmp$ exec 3>zz.txt
xxx@LinuxDDD:/home/tmp$ exec 4>pp.txt
xxx@LinuxDDD:/home/tmp$ ls+ 3>&4 1>&32>&1
在这里3,4分别是zz.txt,pp.txt的文件描述符。这里重定向的时候是先把3重定向到4,然后把1重定向到3,最后是把2重定向到1。这样在打印错误的时候最终是打印到文件描述符4定义的文件中。
所以更深一层,‘>’的左边可是任意的文件描述符(非负整数)或者‘&’。右边是文件名或者&n,其中n代表文件描述符。
6 处理不想要的结果
当输出结果重定向到/dev/null的时候,它对输入不进行任何处理,从而达到隐藏错误的目的。如:
ls>/dev/null;
ls+>/dev/null;
7 标准输入重定向与cat
cat是个强大的命令,它复制一个或者多个文件并且将他们复制到标准输出中,它的基本模式:
cat[file1,file2,….] > xxx;
当没有重定向‘>’的时候,这时候的标准输出就是屏幕,所以它的作用就是合并文件并且显示在屏幕,也就是说起一个显示的作用。如:
catxx.txt
当重定向‘>’左边没有file的时候,此时就是把stdin作为了输入,默认的就是你在键盘上敲字符,然后输出到文件中。示例:
cat >xx.txt
输入的重定向,就是下面这样子了:cat <zz.txt
或者复杂点的 :exec 3>pp.txt; cat <z.txt>&3
8 sort ,uniq,grep
这些都是在在搜索显示的时候常用的一些命令,如sort表示排序,uniq表示去除重复行,grep则是一个强大的查找匹配文本的程序。示例:
xxx@LinuxDDD:/home/tmp$ ls | sort |uniq | grep txt
aa.txt
pp.txt
stdout.txt
z.txt
z.txt~
zz.txt