1. 程式人生 > >6、命令列最酷的功能——IO重定向

6、命令列最酷的功能——IO重定向

I/O 是輸入/輸出(input/output)的縮寫。這個功能可以把命令列的輸入內容重定向為從檔案中獲取內容,也可以把命令列的輸出結果重定向到檔案中。如果我們將多個命令列關聯起來,將形成非常強大的命令——管道。

  • cat:合併文字
  • sort:對文字進行排序
  • uniq:報告或刪除檔案中重複的行
  • wc:列印檔案中的換行符、字和位元組的個數
  • grep:列印匹配行
  • head:輸出檔案中第一部分內容
  • tail:輸出檔案中最後一部分內容
  • tee:讀取標準輸入的資料,並將其內容輸出到標準輸出和檔案中。

標準輸入、標準輸出、標準錯誤

我們使用過的很多程式生成了不同種類的輸出。這些輸出通常包含兩種型別。一種是程式執行的結果,即該程式生成的資料;另一種是狀態和錯誤資訊,表示程式當前的執行情況。比如輸入ls命令,螢幕上將顯示它的執行結果以及它的相關錯誤資訊。

與UNIX“一切都是檔案”的思想一致,類似ls的程式實際上把它們的執行結果傳送到了一個成為標準輸出(standard output,通常表示為stdout)的特殊檔案中,它們的狀態資訊則傳送到了另一個成為標準錯誤(standard error,通常表示為stderr)的檔案中。預設情況下,標準輸出和標準錯誤都將被連結到螢幕上,並且不會被儲存在磁碟檔案中。

另外,許多程式從一個稱為標準輸入(standard input,表示為stdin)的裝置來得到輸入。預設情況下,標準輸入連線到鍵盤。

I/O重定向功能可以改變輸出內容傳送的目的地,也可以改變輸入內容的來源地。通常來說,輸出內容顯示在螢幕上,輸入內容來自於鍵盤。使用I/O重定向功能可以改變。

標準輸出重定向(’>’、’>>’)

I/O重定向功能可以重新定義標準輸出內容傳送到哪裡。使用重定向操作符“>”,後面接檔名,就可以把標準輸出重定向到另一個檔案中,而不是顯示在螢幕上。

ls -l /usr/bin > ls-output.txt

使用重定向符>>將使得輸出內容新增在檔案的尾部。如果這個檔案不存在,將於操作符>的作用一樣建立這個檔案。

ls -l /usr/bin >>
ls-output.txt

標準錯誤重定向(‘2>’’)

標準錯誤重定向並不能簡單的使用一個專用的重定向符來實現。要實現標準錯誤的重定向,不得不提到它的檔案描述符。一個程式可以把生成的輸出內容傳送到任意檔案流中。如果把這些檔案流中的前三個分別對應標準輸入內容,標準輸出檔案和標準錯誤檔案,那麼shell將在內部用檔案描述符分別索引它們為0、1和2.shell提供了使用檔案描述符編號來重定向檔案的表示法。由於標準錯誤等同於檔案描述符2,所以可以使用這種表示法來重定向標準錯誤。

ls -l /bin/usr 2> ls-error.txt

將標準輸出和標準錯誤重定向到同一個檔案(’&>’)

將一個命令的所有輸出內容都放在同一個檔案中。

ls -l /bin/usr > ls-output.txt 2>&1
ls -l /bin/usr &> ls-output.txt

處理不想要的輸出

通過把輸出重定向到/dev/null(一個稱為位桶的裝置),可以實現命令執行後不得到輸出的效果。

ls -l /bin/usr 2> /dev/null

標準輸入重定向

cat < lazy_dog.txt

使用重定向符"<",我們可以把標準輸入的源從鍵盤變為lazy_dog.txt 檔案。(結果和只傳檔名是一樣的)

管道

命令從標準輸入到讀取資料,並將資料傳送到標準輸出的能力,是使用了名位管道的shell特性。使用管道操作符“|”(豎線) 可以把一個命令的標準輸出傳送到另一個命令的標準輸入中。

command1 | command2
ls -l /usr/bin | less