初學Linux之標準 I/O 和管道
通常對于程序來講,輸入輸出數據的可以是鍵盤、鼠標、顯示器等設備。但是我們輸入的是命令,本身并沒有輸入“顯示”這類命令和要求,但是系統就自動的在屏幕上輸出我們命令指定的信息。系統本身默認對一些命令的輸出進行了規范,這樣也是減少了我們在使用Linux 過程中對輸出的考慮,簡化了不必要的繁瑣的操作。對于這些默認的輸入和輸出,我們需要進行了解,這樣對后面的程序學習以及腳本編輯都很有幫助。
一、三種標準 I/O
程序一般包括指令和數據,讀入數據就是 Input ,輸出數據是 Output ,在Linux中,一切皆文件,系統不會識別到具體的文件名,它是通過文件的(fd)文件描述符(數字代號)識別的,若是把鍵盤和屏幕都是作為文件,那么它們的 fd 是多少呢?下圖我們通過一個已經打開的進程(7525),從進程中顯示的三個編號分別為0、1、2,這三個編號就分別是系統對鍵盤輸入,屏幕輸出,屏幕報錯的fd 。
這三個是系統默認的,我們將它們歸為:標準輸入(0),標準輸出(1),標準錯誤輸出(2)。很多命令在屏幕端顯示的,都是標準輸出。而一些在命令輸入完成,回車運行過程中,要求我們使用鍵盤輸入的,就是標準輸入。比如 ls 在屏幕列出的文件和目錄序列, cat 命令在運行過程中,我們在鍵盤輸入的單詞。當我們的輸入不符合規范,或者程序運行出現中斷,程序需要將錯誤的內容突出反饋給用戶,在屏幕顯示的就是標準錯誤輸出。
??
二、把 I/O 重定向入文件
重定向是指將原先的輸入方向更改到其他的,比如從原先從鍵盤輸入的,我們可以更換到其他方式,原先從從屏幕輸出顯示的,我們輸出到其他位置。
首選的重定向方式是—輸出重定向到文件。具體的操作方法是“完整命令 ? ?? 操作符號 ?? 文件名”。支持的操作符號包括:? >? 把標準輸出重定向到文件; 2>? 把標準錯誤輸出重定向到文件; &>? 把兩種輸出一起重定向到文件 。三種都使用到了 “ > ”這個大于符號,這個符號是比較隨意的符號,每次會將后面跟著的文件內容進行覆蓋,對記錄整體的數據是不好處理的,此時可以使用 set -C? 禁止覆蓋,set +C 恢復覆蓋。在禁止覆蓋的情況下,可以使用 “ >|” 這個符號,同同樣實現覆蓋,而“ >> ”雙大于號是追加的,不是覆蓋,禁止覆蓋是沒有關系的,可以使用“ >> ” , “ 2>> ” ,?“ &>> ” 。
? ? ? ? ? ? ?
命令同時具備標準輸出和標準錯誤輸出的,可以使用下面的方法:COMMAND? > /PATH/FILE1? 2> /PATH/FILE2 ,實現標準輸出和錯誤輸出重定向到不同的文件位置。另外這邊需要提及的是:&> ,&>> 并不是對所有版本的Linux系統適用的,若是不能使用,可以在重定向的末尾 加上 2>&1 ,同樣實現標準輸出和錯誤輸出重定向到同一個位置。例如:COMMAND >>/PATH/FIEL? 2>&1 。
當多個程序的一起運行時,可以使用括號括起來,各個程序分號隔開,之后一起重定向到同一個位置。 ( COMMAND 1 ; COMMAND2 ; COMMAND3 ) >FILE.TXT
?
?
? ? ? ? 以上是將輸出重定向,對應的,我們可以將標準輸入重定向。和標準輸出使用“ > ”類似,標準輸入使用的是“ < ”。cat 命令本身是同時有標準輸出和標準輸入的。標準輸入重定向的用法就是在命令的后面加上“ < FILE ” 。?
?? 之前的f1文件里的信息是123,f2文件里的信息是456。示例中就用f2文件中的內容代替了cat命令的鍵盤輸入。
以上是將標準輸入重定向到文件的方法,還有這種多行重定向的方法,使用的符號是 “ <<終止詞 ” ,位置也是在命令的后面。但是要使用終止詞在符號后面。
三、tr 命令的使用
上面我們使用的都是 cat 這個命令,和 cat 一樣包括標準輸入和標準輸出的命令還有很多,tr 命令就是其中之一,這個命令有字符處理的功能,這里可以著重了解一下。
tr 轉換和刪除字符
tr [OPTION]… SET1 [SET2]
常用的選項:? -c –C –complement:取字符集的補集
-d –delete:刪除所有屬于第一字符集的字符
-s –squeeze-repeats:把連續重復的字符以單獨一個字符表示
-t –truncate-set1:將第一個字符集對應字符轉化為第二字符集 對應的字符
四、使用管道鏈接命令
現實生活中的管道是頭尾銜接,傳遞物體流的設備,在Linux中,將數據作為一種“流”,通過管道連接的命令,就可以將“數據流” 前后傳遞。Linux中的管道在命令中間用“ | ”表示。命令1 | 命令2 |命令3 |….. 管道將命令1的標準輸出發送給命令2的標準輸入,命令2的標準輸出作為命令3的標準輸入,如此反復。標準錯誤輸出是無法通過管道傳遞的。可以利用 2>&1 | 或者 |& 。
當管道傳遞的數據不是標準輸出,而是文件,那么不能作為標準輸入傳遞給下一個命令,則可以使用管道中的 “ – ” 符號代替產生的文件,在管道前,作為輸出的文件,在管道后,作為輸入文件。
tar -cvf ? –? /home ? | tar? -xvf? –
另外,管道后面的命令,參數是多個,而管道前的標準輸出是一串數據流,可以使用 | xargs 命令,將數據流中的空格隔開的數據,分成多個參數,一個個傳遞給管道后的命令處理。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/89183