重定向:技巧:Linux I/O重定向的一些小技巧




  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都可以正常工作
  
Tags:  php重定向 linux重定向 301重定向 重定向

延伸阅读

最新评论

发表评论