Linux I/O 重定向虽然很简单但在脚本编写、系统管理时却要常常打交道搞清其中使用窍门技巧非常有用
首先说下什么是I/O重定向所谓I/O重定向简单来说就是个过程这个过程捕捉个文件或者命令脚本甚至脚本中代码块(code block)输出然后把捕捉到输出作为输入发送给另外个文件命令或者脚本
如果谈到I/O重定向就涉及到文件标识符(File Descriptor)概念, 在Linux系统中系统为每个打开文件指定个文件标识符以便系统对文件进行跟踪这里有些和C语言编程里文件句柄相似文件标识符是个数字区别数字代表区别含义默认情况下系统占用了3个分别是0标准输入(stdin),1标准输出(stdout), 2标准(stderr), 另外3-9是保留标识符可以把这些标识符指定成标准输入输出或者作为临时连接通常这样可以解决很多复杂重定向请求
标准输入通常指键盘输入
标准输出通常指显示器输出
标准通常也是定向到显示器
请看以下例子来描述下他们关系
#ls /dev
这个命令列出/dev目录下所有文件在屏幕上输出结果
这里 /dev 就是作为命令ls标准输入(从键盘输入)而打印在屏幕结果就是标准输出(/dev目录中内容)
还是回到标题重定向就是把标准输入或者输出更改成其他方式请参看如下例子
或者等同于
#ls /dev 1>filename #注意:"1"和">"中间没有空格
以上命令会把命令标准输出重新定向到个文件filename,而不是显示到屏幕上如果不指明文件标识符系统默认就是1, 因此1可以省略
如果把上面例子重">"改成">>"则表示把输出追加到filename文件末尾如果文件不存在则创建它如下
#ls /dev >>filename
也可以把标准重新定向到文件
#ls -qw /dev 2>filename
显然 -qw是个参数通常会在显示器上报告个信息但由于把2标准(stderr)重新定向到了文件filename因此显示器没有信息而信息写到了文件里面
以下命令是把标准输出和都定向到文件
#ls /dev &>filename
"&"在这里代表标准输出和标准这里无论是正常输出还是信息都写到filename中了
重新定义标准输入输出和文件标识符
重新定义文件标识符可以用i>&j命令表示把文件标识符i重新定向到j你可以把"&"理解为"取地址"
请看以下例子
#exec 5>&1
表示把文件标识符5定向到标准输出这个命令通常用来临时保存标准输入
同样标准输入也是可以重新定向请参考下面例子
# grep search-word
般来说grep命令在给定文件中搜索串以上命令把文件filename作为grep命令标准输入而不是从键盘输入
前面曾经提到系统为每个打开文件指定个文件标识符以便系统对文件进行跟踪那么默认文件标识符是什么呢?答案是0也就是标准输入或者可以说从键盘输入当然这个文件标识符也可以自己指定请参考下面例子
#echo 123456789 >filename 把串写到文件filename中
#exec 3<>filename 把文件filename打开并指定文件标识符为3
#read -n 4 <&3 从文件中读4个句柄已经指到第 4个末尾
#echo -n . >&3 在第5个处写个点覆盖第5个-n表示不换行
#exec 3>&- 关闭文件标识符3
现在cat filename文件结果就成了1234.6789
命令j<>filename表示把文件打开并指明文件标识符为j
"&-"表示关闭文件标识符
有关关闭文件标识符操作请参考下面
n<&- 关闭输入文件标识符n
0<&-或<&- 关闭标准输入stdin
n>&- 关闭输出文件标识符n
1>&-或>&-关闭标准输出stdout
另外还有些其他命令如下参考
2.:> filename 或者 > filename
表示把文件filename设置成空也就是清空文件内容如果文件不存在则创建个空文件(等同于touch命令) :表示个空输出两个命令唯区别就是>filename不是在所有shell都可以正常工作
最新评论