重定向,將本來輸出到標準輸出的數據重定向到一個文件中,由於標準輸出(/dev/stdout
)自己也是一個文件,咱們將命令輸出導向另外一個文件天然也是沒有任何問題的javascript
$ echo 'hello shiyanlou' > redirect $ echo 'www.shiyanlou.com' >> redirect $ cat redirect
文件描述符 | 設備文件 | 說明 |
---|---|---|
0 |
/dev/stdin |
標準輸入 |
1 |
/dev/stdout |
標準輸出 |
2 |
/dev/stderr |
標準錯誤 |
文件描述符:文件描述符在形式上是一個非負整數。實際上,它是一個索引值,指向內核爲每個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者建立一個新文件時,內核向進程返回一個文件描述符。java
管道默認是鏈接前一個命令的輸出到下一個命令的輸入,而重定向一般是須要一個文件來創建兩個命令的鏈接shell
默認使用終端的標準輸入做爲命令的輸入和標準輸出做爲命令的輸出ruby
catbash
將cat的連續輸出(heredoc方式)重定向到一個文件ui
mkdir Documentsthis
cat > Documents/test.c << EOFspa
將一個文件做爲命令的輸入,標準輸出做爲命令的輸出操作系統
cat Documents/test.ccode
將echo命令經過管道傳過來的數據做爲cat命令的輸入,將標準輸出做爲命令的輸出
echo 'hi' | cat
將echo命令的輸出從默認的標準輸出重定向到一個普通文件
echo 'hello' <redirect
標準輸出和標準錯誤都被指向僞終端的屏幕顯示,因此咱們常常看到的一個命令的輸出一般是同時包含了標準輸出和標準錯誤的結果的。
隱藏某些錯誤或者警告
cat Documents/test.c hello.c < somefile 2<&1
cat Documents/test.c hello.c & <somefile
tee
命令同時重定向到多個文件除了將須要將輸出重定向到文件以外也須要將信息打印在終端,那麼你可使用tee
命令來實現:
echo 'hello' | tee hi
# 先開啓一個子 Shell $ zsh # 使用exec替換當前進程的重定向,將標準輸出重定向到一個文件 $ exec 1>somefile # 後面你執行的命令的輸出都將被重定向到文件中,直到你退出當前子shell,或取消exec的重定向(後面將告訴你怎麼作) $ ls $ exit $ cat somefi
默認在 Shell 中能夠有9個打開的文件描述符,上面咱們使用了也是它默認提供的0
,1
,2
號文件描述符,另外咱們還可使用3-8的文件描述符,只是它們默認沒有打開而已,你可使用下面命令查看當前 Shell 進程中打開的文件描述符:
cd /dev/fd;ls -Al
一樣使用exec
命令能夠建立新的文件描述符:
$ zsh
$ exec 3>somefile # 先進入目錄,再查看,不然你可能不能獲得正確的結果,而後再回到上一次的目錄 $ cd /dev/fd/;ls -Al;cd - # 注意下面的命令>與&之間不該該有空格,若是有空格則會出錯 $ echo "this is test" >&3 $ cat somefile $ exit
如上面咱們打開的3號文件描述符,可使用以下操做將它關閉:
$ exec 3>&- $ cd /dev/fd;ls -Al;cd -
在 Linux 中有一個被稱爲「黑洞」的設備文件,因此導入它的數據都將被「吞噬」。
在類 UNIX 系統中,/dev/null,或稱空設備,是一個特殊的設備文件,它一般被用於丟棄不須要的輸出流,或做爲用於輸入流的空文件,這些操做一般由重定向完成。讀取它則會當即獲得一個EOF。
咱們能夠利用設個/dev/null
屏蔽命令的輸出:
$ cat Documents/test.c nefile 1>/dev/null 2>&1
xargs 是一條 UNIX 和類 UNIX 操做系統的經常使用命令。它的做用是將參數列表轉換成小塊分段傳遞給其餘命令,以免參數列表過長的問題。
這個命令在有些時候十分有用,特別是當用來處理產生大量輸出結果的命令如 find,locate 和 grep 的結果,詳細用法請參看 man 文檔。
$ cut -d: -f1 < /etc/passwd | sort | xargs echo
上面這個命令用於將/etc/passwd
文件按:
分割取第一個字段排序後,使用echo
命令生成一個列表。