您的位置:首页 > 运维架构 > Shell

Linux shell的标准输入、输出和错误

2016-03-03 19:33 337 查看
1.文件描述符

在linux shell执行命令时,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。由于文件描述符不容易记忆,shell同时也给出了相应的文件名:

文件文件描述符
输入文件—标准输入0(缺省是键盘,为0时是文件或者其他命令的输出)
输出文件—标准输出1(缺省是屏幕,为1时是文件)
错误输出文件—标准错误2(缺省是屏幕,为2时是文件)
系统中实际上有12个文件描述符,我们可以任意使用文件描述符3到9.

2.文件重定向:改变程序运行的输入来源和输出地点

2.1.输出重定向:

Command > filename把标准输出重定向到一个新文件中
Command >> filename把标准输出重定向到一个文件中(追加)
Command > filename把标准输出重定向到一个文件中
Command > filename 2>&1把标准输出和错误一起重定向到一个文件中
Command 2 > filename把标准错误重定向到一个文件中
Command 2 >> filename把标准输出重定向到一个文件中(追加)
Command >> filename2>&1把标准输出和错误一起重定向到一个文件(追加)
2.2.输入重定向:

Command < filename > filename2Command命令以filename文件作为标准输入,以filename2文件作为标准输出
Command < filenameCommand命令以filename文件作为标准输入
Command << delimiter 从标准输入中读入,知道遇到delimiter分界符
2.3.绑定重定向

Command >&m把标准输出重定向到文件描述符m中
Command < &-关闭标准输入
Command 0>&-同上
3.shell重定向的一些高级用法
3.1.重定向标准错误

例子1:

command 2> /dev/null

如果command执行出错,将错误的信息重定向到空设备

例子2:

command > out.put 2>&1

将command执行的标准输出和标准错误重定向到out.put(也就是说不管command执行正确还是错误,输出都打印到out.put)。

3.2.exec用法

exec命令可以用来替代当前shell;换句话说,并没有启动子shell,使用这一条命令时任何现有环境变量将会被清除,并重新启动一个shell(重新输入用户名和密码进入)。

exec command

其中,command通常是一个shell脚本。

对文件描述符操作的时候用(也只有再这时候),它不会覆盖你当前的shell

例子1:

#!/bin/bash

#file_desc

exec 3<&0 0<name.txt

read line1

read line2

exec 0<&3

echo $line1

echo $line2

其中:

首先,exec 3<&0 0<name.txt的意思是把标准输入重定向到文件描述符3(0表示标准输入),然后把文件name.txt内容重定向到文件描述符0,实际上就是把文件name.txt中的内容重定向到文件描述符3。然后通过exec打开文件描述符3;

然后,通过read命令读取name.txt的第一行内容line1,第二行内容line2,通过Exec 0<&3关闭文件描述符3;

最后,用echo命令输出line1和line2。最好在终端运行一下这个脚本,亲自尝试一下。

例子2:

exec 3<>test.sh;

#打开test.sh可读写操作,与文件描述符3绑定

 

while read line<&3

 do

    echo $line;

done

#循环读取文件描述符3(读取的是test.sh内容)

exec 3>&-

exec 3<&-

#关闭文件的,输入,输出绑定

参考:

http://zqwt.012.blog.163.com/blog/static/1204468420103272857116/

http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html

http://blog.csdn.net/flowingflying/article/details/5201199
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: