I/o重定向詳解

一、I/O重定向基本概念

I/O重定向有三種定義打開文件:stdin (the keyboard), stdout (the screen), and stderr (error messages output to the screen)。每個打開的文件都是通過文件描述符(File Descriptor)來標識的,內核爲每個進程維護了一個文件描述符表,這個表以FD爲索引,再進一步指向文件的詳細信息。在進程創建時,內核爲進程默認創建了0、1、2三個特殊的FD,這就是stdin、stdout和stderr。

二、stdout和stderr

查看文件File Descriptor

    [root@localhost/dev/fd]#ll /dev/fd/
   total 0
   lrwx------ 1 root root 64 Jul 16 07:18 0 -> /dev/pts/2
   lrwx------ 1 root root 64 Jul 16 07:18 1 -> /dev/pts/2
   lrwx------ 1 root root 64 Jul 16 07:18 2 -> /dev/pts/2
   lr-x------ 1 root root 64 Jul 16 07:18 3 -> /proc/5696/fd

支持的操作符號包括:

  • 1>或 > 把stdout重定向到文件中,並覆蓋文件中的內容

    示例1  
     [root@localhost~]#touch a.txt
     [root@localhost~]#ls > a.txt
     [root@localhost~]#cat a.txt
     a
     anaconda-ks.cfg
     Desktop
     Documents
     Downloads
     ...
    示例2
     [root@localhost~]#touch b.txt
     [root@localhost~]#cat /etc/passwd b.txt
     root:x:0:0:root:/root:/bin/bash
     bin:x:1:1:bin:/bin:/sbin/nologin
     daemon:x:2:2:daemon:/sbin:/sbin/nologin
     adm:x:3:4:adm:/var/adm:/sbin/nologin
     lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     ...
  • 2> 把stderr重定向到文件中並覆蓋文件中的內容

    示例1  
     [root@localhost~]#lss 2> c.txt
     [root@localhost~]#cat c.txt
     bash: lss: command not found...
     Similar command is: 'ls'示例2  
     [root@localhost~]#ls /ett 2> c.txt
     [root@localhost~]#cat c.txt
     ls: cannot access /ett: No such file or directory
  • &> 把所有輸出重定向到文件中並覆蓋文件中的內容

    示例1 
     [root@localhost~]#touch d.txt
     [root@localhost~]#ls /etc  /err &> d.txt
     [root@localhost~]#cat d.txt
     ls: cannot access /err: No such file or directory
     /etc:
     abrt
     adjtime
     aliases
     aliases.db
     ...

    追加重定向(>>),不會覆蓋文件內容

    示例1   
     [root@localhost~]#cat a.txt
      /etc/drirc
     [root@localhost~]#ls /etc/issue >> a.txt
     [root@localhost~]#cat a.txt
     /etc/drirc
     /etc/issue
    示例2
     [root@localhost~]#cat b.txt
     /etc/dnsmasq.conf
     [root@localhost~]#ls /ett 2>>b.txt
     [root@localhost~]#cat b.txt
     /etc/dnsmasq.confls: cannot access /ett: No such file or directory
    示例3
     [root@localhost~]#cat c.txt
     ls: cannot access /ett: No such file or directory
     [root@localhost~]#ls /etc/d
     dbus-1/                     dnsmasq.conf
     dconf/                      dnsmasq.d/
     default/                    dracut.conf
     depmod.d/                   dracut.conf.d/
     dhcp/                       drirc
     dleyna-server-service.conf  
     [root@localhost~]#ls /etc/drirc /ett &> c.txt
     [root@localhost~]#cat c.txt
     ls: cannot access /ett: No such file or directory
     /etc/drirc
  • 2>&1 將錯誤和正確的信息放到同一個文件中,與>&和1>&2等價

      [root@localhost~]#ls /etc/issue /stt > d.txt 2>&1
     [root@localhost~]#cat d.txt
     ls: cannot access /stt: No such file or directory
    /etc/issue

set -C :禁止將內容覆蓋已有文件,但可追加強制覆蓋:“>|”
set +C :允許覆蓋

示例1
   [root@localhost~]#set -C
   [root@localhost~]#ls /etc/issue > a.txt
   -bash: a.txt: cannot overwrite existing file
   [root@localhost~]#ls /ett 2> a.txt
   -bash: a.txt: cannot overwrite existing file

()合併多個程序的stdout

    [root@localhost~]#(ls /etc/issue ; cat a.txt) > c.txt
   [root@localhost~]#cat c.txt
   /etc/issue    /etc/drirc    /etc/issue    /etc/issue

三、標準輸入

示例1
   [root@localhost~]#cat </etc/issue
   \S
   Kernel \r on an \m示例2
   [root@localhost~]#cat >f1 <<eof
   > aaa
   > bbb
   > ccc
   > eof
<<終止詞必須相等,最後一個輸入相同即退出;

四、其他

管道:
COMMAND1 | COMMAND2
將錯誤和正確標準輸出

    ls /boot /err 2>&1 |tr 'a-z' 'A-Z'
   ls /boot /err  |& tr 'a-z' 'A-Z'

less 命令可以上下翻 直接退出
more 命令不可以上翻 退出按q

‘- ’符號
示例
將/home裏面的文件打包,但打包的數據不是記錄到文件,而是傳遞到stdout,經過管道後,將tar - CVF - /home傳遞給後面的tar -xvg -,後面的這個 - 則是天譴一個命令的stdout,因此,就不需要使用臨時file了

    tar -cvf - /home |tar -xvf -

tee命令
-a append 附加 ;不覆蓋原文件
示例

    ls /boot |tee ls.out

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章