相信熟悉linux的童鞋不会对这四个符合陌生,shell脚本的文件流有时候真的挺容易搞晕人的,下面我们一起了解一下吧
参考链接:http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html
文件描述符linux启动后,会默认打开3个文件描述符,分别是:标准输入standard input 0,正确输出standard output 1,错误输出:error output 2
以后打开文件后。新增文件绑定描述符 可以依次增加。 一条shell命令执行,都会继承父进程的文件描述符。因此,所有运行的shell命令,都会有默认3个文件描述符。
linux shell下常用输入输出操作符是:
1. 标准输入 (stdin) :代码为 0 ,使用 < 或 << ; /dev/stdin -> /PRoc/self/fd/0 0代表:/dev/stdin
2. 标准输出 (stdout):代码为 1 ,使用 > 或 >> ; /dev/stdout -> /proc/self/fd/1 1代表:/dev/stdout
3. 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ; /dev/stderr -> /proc/self/fd/2 2代表:/dev/stderr
>,>>输出重定向:表示把将输出重定向到屏幕或者设备或者文件下面我们直接看一些例子吧
qiweijie@qiweijie:~/study_shell$lst.txt t.txt1ls: 无法访问t.txt1: 没有那个文件或目录
t.txt
# 正确输出和错误输出都显示在屏幕上
# 我们试着把正确输出重定向到suc.txt(success),可以看到屏幕输出上只有错误输出了,
#从这里也可以看出,默认的正确输出(代码为1,)是可以忽略不写的
qiweijie@qiweijie:~/study_shell$lst.txt t.txt1 >suc.txtls: 无法访问t.txt1: 没有那个文件或目录
qiweijie@qiweijie:~/study_shell$catsuc.txt
t.txt
# 正确输出和错误输出分别输出到不同的文件
qiweijie@qiweijie:~/study_shell$lst.txt t.txt11>suc.txt2>err.txt
qiweijie@qiweijie:~/study_shell$catsuc.txt err.txt
t.txtls: 无法访问t.txt1: 没有那个文件或目录
#>>这样写表示追加到文件
qiweijie@qiweijie:~/study_shell$lst.txt t.txt11>>suc.txt2>>err.txt
qiweijie@qiweijie:~/study_shell$catsuc.txt err.txt
t.txt
t.txtls: 无法访问t.txt1: 没有那个文件或目录ls: 无法访问t.txt1: 没有那个文件或目录
#&[-,1,2] 分别表示关闭对应的标识,正确输出,错误输出
# 关闭错误输出
qiweijie@qiweijie:~/study_shell$lst.txt t.txt12>&-t.txt
# 错误输出重定向到/dev/nullqiweijie@qiweijie:~/study_shell$lst.txt t.txt12>/dev/nullt.txt
# 错误输出重定向到到文件
qiweijie@qiweijie:~/study_shell$lst.txt t.txt12>err1.txt
t.txt
# 关闭正确输出和错误输出
qiweijie@qiweijie:~/study_shell$lst.txt t.txt11>&-2>&-# 都输出到/dev/nullqiweijie@qiweijie:~/study_shell$lst.txt t.txt11>/dev/null2>/dev/null# 把错误输出重定向到正确输出,正确输出重定向到/dev/nullqiweijie@qiweijie:~/study_shell$lst.txt t.txt11>/dev/null2>&1qiweijie@qiweijie:~/study_shell$lst.txt t.txt1 >/dev/null2>&1qiweijie@qiweijie:~/study_shell$lst.txt t.txt1 >ttt.txt2>&1qiweijie@qiweijie:~/study_shell$catttt.txtls: 无法访问t.txt1: 没有那个文件或目录
t.txt
#&代表所有输出
qiweijie@qiweijie:~/study_shell$lst.txt t.txt1 &>/dev/nullqiweijie@qiweijie:~/study_shell$lst.txt t.txt1 &>te.txt
qiweijie@qiweijie:~/study_shell$catte.txtls: 无法访问t.txt1: 没有那个文件或目录
t.txt
输入重定向<,<<也是直接来看一些例子吧
# cat命令表示从屏幕获取输入,然后输出
qiweijie@qiweijie:~/study_shell$catsadf
sadf
# 最简单的例子,从屏幕获取输入,然后重定向给qwj(这里用到是的是输出重定向
qiweijie@qiweijie:~/study_shell$cat>qwj
qiweijie shi 2B
qiweijie@qiweijie:~/study_shell$catqwj
qiweijie shi 2B
#这里首先是从文件qwj获取输入给cat,然后cat输入重定向给qwj1
qiweijie@qiweijie:~/study_shell$cat> qwj1 <qwj
qiweijie@qiweijie:~/study_shell$catqwj1
qiweijie shi 2B
#<<两个小于号连在一起表示接受一个输入结束的标识,当输入这个标识是结束输入
qiweijie@qiweijie:~/study_shell$cat>QQ<<eof>q>w>j>eof
qiweijie@qiweijie:~/study_shell$catqq
qwj
qiweijie@qiweijie:~/study_shell$cat> qqq <<e>q>w>e
qiweijie@qiweijie:~/study_shell$catqqq
qwqiweijie@qiweijie:~/study_shell$
exec绑定重定向# 绑定新的文件描述符之前的状态
qiweijie@qiweijie:~/study_shell$ls
/proc/self/fd0123# 绑定一个新的文件描述符6,并且绑定标准输出(相当于给标准输出保存一个临时copy)
qiweijie@qiweijie:~/study_shell$ exec6>&1qiweijie@qiweijie:~/study_shell$ls
/proc/self/fd01236# 绑定标准输出给suc.txt
qiweijie@qiweijie:~/study_shell$ exec1>suc.txt
# 发现标准输出都没有了啊
qiweijie@qiweijie:~/study_shell$ls-al
# 俨然发现suc.txt已经是输出文件
qiweijie@qiweijie:~/study_shell$catsuc.txtcat: suc.txt:输入文件是输出文件
qiweijie@qiweijie:~/study_shell$ls
/proc/self/fd
# 把标准输出绑定回来
qiweijie@qiweijie:~/study_shell$ exec1>&6qiweijie@qiweijie:~/study_shell$ls
/proc/self/fd01236# 关闭自定义的文件描述符
qiweijie@qiweijie:~/study_shell$ exec6>&-qiweijie@qiweijie:~/study_shell$ls
/proc/self/fd0123qiweijie@qiweijie:~/study_shell$catsuc.txt
总用量128drwxrwxr-x2qiweijie qiweijie409611月2410:50.
drwxr-xr-x34qiweijie qiweijie409611月2410:06..-rw-rw-r--1qiweijie qiweijie6111月1814:19atlga.xml-rw-rw-r--1qiweijie qiweijie3511月1814:16atlga.xml.old-rw-rw-r--1qiweijie qiweijie1311月1716:17dos-file.txt-rw-rw-r--1qiweijie qiweijie5211月2410:11err1.txt-rw-rw-r--1qiweijie qiweijie10411月2410:09err.txt-rw-rw-r--1qiweijie qiweijie4111月1814:20example.txt-rwxrwxr-x1qiweijie qiweijie9411月1716:56finduser-rw-rw-r--1qiweijie qiweijie011月2410:50g-rw-rw-r--1qiweijie qiweijie32411月1814:57merge-sales.sh-rw-rw-r--1qiweijie qiweijie27111月1817:08my-friends-rw-rw-r--1qiweijie qiweijie14011月2317:43my-friends.sh-rwxrwxr-x1qiweijie qiweijie14111月1716:34nusers-rw-rw-r--1qiweijie qiweijie195811月1813:54passwd.txt-rw-rw-r--1qiweijie qiweijie611月2410:48qq-rw-rw-r--1qiweijie qiweijie411月2410:49qqq-rw-rw-r--1qiweijie qiweijie3511月1814:54quotas-rw-rw-r--1qiweijie qiweijie1611月2410:46qwj-rw-rw-r--1qiweijie qiweijie1611月2410:47qwj1-rw-rw-r--1qiweijie qiweijie3911月1814:53sales-rw-rw-r--1qiweijie qiweijie011月2411:00suc.txt-rw-rw-r--1qiweijie qiweijie5811月2410:40te.txt-rwxrwxr-x1qiweijie qiweijie5511月1717:02trace1.sh-rw-rw-r--1qiweijie qiweijie5811月2410:31ttt.txt-rw-rw-r--1qiweijie qiweijie2373311月1815:52t.txt-rw-rw-r--1qiweijie qiweijie1411月1716:18unix-file.txt-rw-rw-r--1qiweijie qiweijie1311月1716:20unix.txt-rw-rw-r--1qiweijie qiweijie2511月1716:15UN工x-file.txt01236# 如果直接把标准输出绑定到文件,那么问题就是,你再也变不回来了
qiweijie@qiweijie:~/study_shell$ exec1>suc.txt
qiweijie@qiweijie:~/study_shell$catsuc.txtcat: suc.txt:输入文件是输出文件
qiweijie@qiweijie:~/study_shell$ exec1>&-qiweijie@qiweijie:~/study_shell$catsuc.txtcat: 标准输出: 错误的文件描述符
qiweijie@qiweijie:~/study_shell$ls
/proc/self/fdls: 写入错误: 错误的文件描述符
qiweijie@qiweijie:~/study_shell$
相信通过这些例子,大家对文件描述符和<,<<,>,>>这四个符号应该有一定的印象了吧