linux的輸入輸出重定向和管道

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命令的執行都有下面的過程:

wKioL1edqciB8dB5AAA7KobIu2Y777.png-wh_50


 

一條命令的執行需要鍵盤等的標準輸入,命令的執行,和正確或錯誤,其中的每一個雙向箭頭就是一個通道,所以數據流既可以流入到文件(就是重定向或管道),也可以流出到屏幕如果命令所需的輸入不是來自鍵盤,而是來自指定的文件,這就是輸入重定向。同理,命令的輸出也可以不顯示在屏幕上,而是寫入到指定文件中,這就是輸出重定向。

 

 重定向符號

>   輸出重定向到一個文件或設備 覆蓋原來的文件

>!  輸出重定向到一個文件或設備 強制覆蓋原來的文件

>>  輸出重定向到一個文件或設備 追加原來的文件

<   輸入重定向到一個程序

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是文本結束標識符,可以自己定義文本結束標識符

 


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