天天看点

文件描述符stdin,stdout,stderr,重定向

Linux Shell 文件描述符stdin,stdout,stderr,重定向

系统保留的三个文件描述符分类

0 标准输入 stdin		/dev/stdin
1 标准输出 stdout 	/dev/stdout
2 标准错误 stderr	/dev/stderr
           

另外,当一个用户进程被创建的时候,系统会自动为该进程创建三个文件描述符0,1,2,对应的就是 stdin, stdout, stderr。当进程结束后,进程编号对应的目录将被清理。

ps -ef |grep php // 找到要查看的进程号,比如 9876
cd /proc/9876/fd
ll
           
文件描述符stdin,stdout,stderr,重定向

pts/0

表示会话编号,以及输入和输出在那个会话上展示。

stdout 和 stderr 都是输出到屏幕,他们的区别在于 stdout是有缓冲的,而stderr是无缓冲的,会直接输出。

对文件描述符进行重定位(重定位运算符)

>  替换原有内容
>> 内容追加到末尾
           
重定位运算符 ">" ">>" 的默认参数为标准输出 stdout ,即 1 ;也就是说 > 和 >> 默认只接收 stdout 。
所以 ">" 等价于 "1>"; ">>" 等价于 "1>>",也就是说 ls > out.log 就是 ls 1> out.log 
注意 1和>之间不能有空格,使用数字来重定向都不能有空格。
           

解释:

(0)、何为标准输入和标砖输出

标准输入: /dev/stdin 文件里面的数据
标准输出: /dev/stdout 文件里面的数据
           

(1)、当我们输入“输出指令”,例如 ls, echo 等返回的信息归为stdout;

比如:
ls > out.log
cat out.log
有内容

比如:
ls + > out2.log
ls: 无法访问+: 没有那个文件或目录
cat out2.log
空的,为什么呢?那显然返回的内容不是stdout,而是stderr,我们可以使用 $? 获取最后一条命令执行的返回值,
当返回值为零代表命令执行成功。
ls + > out2.log
echo $?
2
那么我们可不可以把标准错误重定向到标准输出呢,答案是可以的,2>&1 一般写在后面,表示如果出错了就重定向,
作为一种补救措施,毕竟谁也不能预知错误。
ls + > out3.log 2>&1
cat out3.log
ls: 无法访问+: 没有那个文件或目录

或者使用 &>
ls + &> out3.log
           

(2)、可以同时重定向stdout与stderr到指定的文件

cat out*.log 2>stderr.txt 1>stdout.txt
           

(3)、将stderr/stdout重定向到无底洞 /dev/null

ls + > /dev/null 2>&1
如果命令执行成功则将 stdout 定向到 /dev/null ,如果执行失败,则将 stderr 定向到 stdout 然后 
stdout 定向到 /dev/null
           

继续阅读