1. 在瞭解重定向之前,我們先來看看linux 的文件描述符。
linux文件描述符:可以理解爲linux爲了跟蹤打開文件,而分配的一個數字,(人是根據文件名追蹤文件,系統則是根據文件描述符),這個數字有點類似c語言操作文件時候的指針,通過指針就可以實現文件的讀寫操作。 用戶可以自定義文件描述符範圍是:3-num,這個最大數字,跟用戶的:ulimit –n 定義數字有關係,不能超過最大值。
linux啓動後,會默認打開3個文件描述符,分別是:標準輸入standard input 0,正確輸出standard output 1,錯誤輸出:error output 2以後打開文件後。新增文件綁定描述符可以依次增加。 一條shell命令執行,都會繼承父進程的文件描述符。因此,所有運行的shell命令,都會有默認3個文件描述符。
Linux 給程序提供三種I/O 設備
標準輸入(STDIN )-0 默認接受來自鍵盤的輸入
標準輸出(STDOUT )-1 默認輸出到終端窗口
標準錯誤(STDERR )-2 默認輸出到終端窗口
對於任何linux命令的執行都有下面的過程:
一條命令的執行需要鍵盤等的標準輸入,命令的執行,和正確或錯誤,其中的每一個雙向箭頭就是一個通道,所以數據流既可以流入到文件(就是重定向或管道),也可以流出到屏幕如果命令所需的輸入不是來自鍵盤,而是來自指定的文件,這就是輸入重定向。同理,命令的輸出也可以不顯示在屏幕上,而是寫入到指定文件中,這就是輸出重定向。
重定向符號
> 輸出重定向到一個文件或設備 覆蓋原來的文件
>! 輸出重定向到一個文件或設備 強制覆蓋原來的文件
>> 輸出重定向到一個文件或設備 追加原來的文件
< 輸入重定向到一個程序
2. 標準錯誤重定向符號
2> 將一個標準錯誤輸出重定向到一個文件或設備覆蓋原來的文件 b-shell
2>> 將一個標準錯誤輸出重定向到一個文件或設備追加到原來的文件
2>&1將一個標準錯誤輸出重定向到標準輸出 註釋:1就是代表標準輸出
>& 將一個標準錯誤輸出重定向到一個文件或設備覆蓋原來的文件 c-shell
|& 將一個標準錯誤管道輸出到另一個命令作爲輸入
接下來看看標準輸入/輸出重定向在構造一條Linux命令中的實際應用。
3. 輸入重定向和輸出重定向
[root@centos7 testdir]# wc aa.txt //命令等於 wc< aa.txt 但是一般都簡寫成前者 [root@centos7 testdir]# ls >ls_file.txt
第一條命令將文件aa.txt作爲wc命令的輸入,統計出aa.txt的行數、單詞數和字符數。第二條命令將ls命令的輸出保存在一個名爲ls_file.txt的文件中。如果>符號後邊的文件已存在,那麼這個文件將被重寫。
利用管道
利用Linux所提供的管道符“|”將兩個命令隔開,管道符左邊命令的輸出就會作爲管道符右邊命令的輸入。連續使用管道意味着第一個命令的輸出會作爲第二個命令的輸入,第二個命令的輸出又會作爲第三個命令的輸入,依此類推。下面來看看管道是如何在構造一條Linux命令中得到應用的。
4.利用管道將前面命令的標準輸入和標準錯誤都輸入到wc –l進行統計行數
[root@centos7 testdir]# ls a.txt [root@centos7 testdir]# ll a.txt b.txt |& wc -l 2
5.將標準輸入和標準錯誤分別進行保存至文件corr.log 和err.log
[root@centos7testdir]# ls a.txt [root@centos7 testdir]#ll a.txt b.txt |& wc -l 2 [root@centos7 testdir]# ll a.txt b.txt >>corr.log 2>> err.log [root@centos7 testdir]# ll total 20 -rw-r--r--. 1 root root 136 Jul 30 16:11 a.txt -rw-r--r--. 1 root root 47 Jul 30 20:46 corr.log -rw-r--r--. 1 root root 51 Jul 30 20:46 err.log [root@centos7testdir]# cat corr.log -rw-r--r--. 1 root root 136 Jul 30 16:11 a.txt [root@centos7 testdir]# cat err.log ls: cannot access b.txt: No such file or directory
6.將標準輸出和錯誤輸出到同一個文件:
[root@centos7 testdir]# ll a.txt b.txt >>all.log 2>&1 [root@centos7 testdir]# ll a.txt b.txt &>>all2.log [root@centos7 testdir]# cat all2.log ls: cannot access b.txt: No such file or directory -rw-r--r--. 1 root root 136 Jul 30 16:11 a.txt [root@centos7 testdir]# cat all.log ls: cannot access b.txt: No such file or directory -rw-r--r--. 1 root root 136 Jul 30 16:11 a.txt
注意:上面的兩種方法都行,前者是rhel5以前的版本都支持,&>>是較新的寫法
7. 多行重定向:
[root@centos7 ~]#mail -s "this is jack_cui send mail to root" root << enf > hello root > this is testmail to you > enf
其中enf是文本結束標識符,可以自己定義文本結束標識符