自學Linux Shell11.4-重定向輸入輸出

點擊返回 自學Linux命令行與Shell腳本之路html

11.4-重定向輸入輸出

Linux 命令默認從標準輸入設備(stdin)獲取輸入,將結果輸出到標準輸出設備(stdout)顯示。通常狀況下,標準輸入設備就是鍵盤,標準輸出設備就是終端,即顯示器。tcp

重定向命令列表以下:spa

命令 說明
command > file 將輸出重定向到 file。
command < file 將輸入重定向到 file。
command >> file 將輸出以追加的方式重定向到 file。
n > file 將文件描述符爲 n 的文件重定向到 file。
n >> file 將文件描述符爲 n 的文件以追加的方式重定向到 file。
n >& m 將輸出文件 m 和 n 合併。
n <& m 將輸入文件 m 和 n 合併。
<< tag 將開始標記 tag 和結束標記 tag 之間的內容做爲輸入

1. 輸出重定向

重定向通常經過在命令間插入特定的符號來實現。特別的,這些符號的語法以下所示:命令行

command1 > file1

上面這個命令執行command1而後將輸出的內容存入file1。翻譯

注意:任何file1內的已經存在的內容將被新內容替代。若是要將新內容添加在文件末尾,請使用>>操做符。3d

執行who >users 並無顯示,而是將who命令結果重定向到users文件,若文件不存在會新建一個文件。
code

覆蓋,,已經存在的內容將被新內容替代。
htm

使用>>操做符,將新內容添加在文件末尾。blog

2. 輸入重定向

輸入重定向是將文件的內容重定向到命令。排序

2.1  輸出重定向同樣,Unix 命令也能夠從文件獲取輸入,語法爲:

1  command1 < file1

這樣,原本須要從鍵盤獲取輸入的命令會轉移到文件讀取內容。

注意:輸出重定向是大於號(>),輸入重定向是小於號(<)。

 

注意:上面結果不一樣:第一個例子,會輸出文件名;第二個不會,由於它僅僅知道從標準輸入讀取內容。

2.2  Here Document(內聯輸入重定向) 一種特殊的輸入重定向

Here Document 目前沒有統一的翻譯,這裏暫譯爲」嵌入文檔「。Here Document 是 Shell 中的一種特殊的重定向方式,它的基本的形式以下:

1 command << delimiter
2 document
3 delimiter

它的做用是將兩個 delimiter 之間的內容(document) 做爲輸入傳遞給 command。

注意:

結尾的delimiter 必定要頂格寫,前面和後面都不能有任何字符(包括空格和 tab 縮進)。
開始的delimiter先後的空格會被忽略掉。

wc命令時分別輸出文件的行數,單詞數和字節數。

3. 重定向深刻講解(點擊這裏得到更多

通常狀況下,每一個 Linux 命令運行時都會打開三個文件:

  • 標準輸入文件(stdin):stdin的文件描述符爲0,Unix程序默認從stdin讀取數據。
  • 標準輸出文件(stdout):stdout 的文件描述符爲1,Unix程序默認向stdout輸出數據。
  • 標準錯誤文件(stderr):stderr的文件描述符爲2,Unix程序會向stderr流中寫入錯誤信息。

默認狀況下,command > file 將 stdout 重定向到 file,command < file 將stdin 重定向到 file。

若是但願 stderr 重定向到 file,能夠這樣寫:$command 2 > file

若是但願 stderr 追加到 file 文件末尾,能夠這樣寫:$command 2 >> file    2 表示標準錯誤文件(stderr)。

若是但願將 stdout 和 stderr 合併後重定向到 file,能夠這樣寫:  $command > file 2>&1或$command >> file 2>&1

若是但願對 stdin 和 stdout 都重定向,能夠這樣寫:   $command < file1 >file2      command 命令將 stdin 重定向到 file1,將 stdout 重定向到 file2。

不論輸出標準輸入或標準輸出仍是標準錯誤文件均可以輸入到file中。你能夠這樣寫:   $command &>>file

4. /dev/null 文件

若是但願執行某個命令,但又不但願在屏幕上顯示輸出結果,那麼能夠將輸出重定向到 /dev/null:

1 command > /dev/null

/dev/null 是一個特殊的文件,寫入到它的內容都會被丟棄;若是嘗試從該文件讀取內容,那麼什麼也讀不到。可是 /dev/null 文件很是有用,將命令的輸出重定向到它,會起到"禁止輸出"的效果。

若是但願屏蔽 stdout 和 stderr,能夠這樣寫:

1  command > /dev/null 2>&1

注意:0 是標準輸入(STDIN),1 是標準輸出(STDOUT),2 是標準錯誤輸出(STDERR)。

5.   重定向&操做符

重定向操做符 & 能夠將輸出或輸入從一個指定句柄複製到另外一個指定的句柄。例如,要將 dir 輸出發送到 File.txt 並將錯誤輸出發送到 File.txt,請鍵入:

1 dir>c:/file.txt 2>&1

複製句柄時,能夠複製該句柄原狀態的全部特性。
例如,若是一個句柄具備只讀訪問的屬性,則該句柄的全部副本都具備只讀訪問屬性。不能將一個具備只讀訪問屬性的句柄複製到另外一個具備只寫訪問屬性的句柄。

5.1 使用 & 操做符重定向輸入和副本

  • 要將重定向輸入操做符 (<) 與複製操做符 (&) 結合使用,指定的文件必須已經存在。
  • 若是輸入文件存在,Cmd.exe 將以只讀方式打開該文件,而後將文件包含的字符做爲輸入發送到此命令(如同從鍵盤輸入同樣)。
  • 若是指定了句柄,Cmd.exe 將指定的句柄複製到系統現有的句柄中。

例:
要以句柄 0 輸入讀取(即 STDIN)的方式打開 File.txt,請鍵入: <file.txt

要打開 File.txt,並在內容排序後將輸出發送到命令提示符窗口(即 STDOUT),請鍵入:sort<file.txt

要查找 File.txt,而後將句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到 Search.txt,請鍵入:indfile file.txt>search.txt 2<&1

要以句柄 0 輸入讀取(即 STDIN)的方式複製用戶定義的句柄 3,請鍵入:  <&3

5.2  使用 & 操做符重定向輸出和複製

若是將輸出重定向到文件且指定了現有的文件名,Cmd.exe 將以只寫方式打開文件並覆蓋該文件內容。若是指定了句柄,Cmd.exe 將文件複製到現有句柄中。

要將用戶定義的句柄 3 複製到句柄 1,請鍵入:>&3

要將包括句柄 2(即 STDERR)的全部輸出從 ipconfig 命令重定向到句柄 1(即 STDOUT),而後將輸出重定向到 Output.log,請鍵入:ipconfig.exe>>output.log 2>&1

5.3 使用 >> 重定向操做符附加輸出

要從命令中將輸出添加到文件末尾而不丟失文件中已存在的任何信息,請使用兩個連續的大於號(即 >>)。

使用下列命令能夠將 dir 命令生成的目錄列表附加到 Dirlist.txt 文件:dir>>dirlist.txt

要將 netstat 命令的輸出附加到 Tcpinfo.txt 的末尾,請鍵入:netstat>>tcpinfo.txt

6.   管道操做符 |

  • 管道操做符 (|) 能夠提取一個命令的輸出(默認狀況下是 STDOUT),而後將其定向到另外一個命令的輸入(默認狀況下是 STDIN)中。
  • 管道操做符 (|) 能夠再一條命令中使用任意多條| 
  • 管道操做符 (|) 最流行的用法之一將命令產生的大量輸出經過管道傳送給more命令

例 :使用以下命令能夠對目錄進行分類:         

          dir | sort

將同時啓動兩個命令,但隨後 sort 命令會暫停,直到它接收到 dir 命令的輸出爲止。
sort 命令使用 dir 命令的輸出做爲輸入,而後將輸出發送到句柄 1(即 STDOUT)。

 

相關文章
相關標籤/搜索