重定向,將原本輸出到標準輸出的數據重定向到一個文件中,因為標準輸出(/dev/stdout)本身也是一個文件,我們將命令輸出導向另一個文件自然也是沒有任何問題的
$ echo 'hello shiyanlou' > redirect
$ echo 'www.shiyanlou.com' >> redirect
$ cat redirect
簡單的重定向
|
文件描述符
|
設備文件
|
説明
|
|
|
|
標準輸入
|
|
|
|
標準輸出
|
|
|
|
標準錯誤
|
文件描述符:文件描述符在形式上是一個非負整數。實際上,它是一個索引值,指向內核為每一個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者創建一個新文件時,內核向進程返回一個文件描述符。
管道默認是連接前一個命令的輸出到下一個命令的輸入,而重定向通常是需要一個文件來建立兩個命令的連接
默認使用終端的標準輸入作為命令的輸入和標準輸出作為命令的輸出
cat
將cat的連續輸出(heredoc方式)重定向到一個文件
mkdir Documents
cat > Documents/test.c << EOF
將一個文件作為命令的輸入,標準輸出作為命令的輸出
cat Documents/test.c
將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 分割參數列表
xargs 是一條 UNIX 和類 UNIX 操作系統的常用命令。它的作用是將參數列表轉換成小塊分段傳遞給其他命令,以避免參數列表過長的問題。
這個命令在有些時候十分有用,特別是當用來處理產生大量輸出結果的命令如 find,locate 和 grep 的結果,詳細用法請參看 man 文檔。
$ cut -d: -f1 < /etc/passwd | sort | xargs echo
上面這個命令用於將/etc/passwd文件按:分割取第一個字段排序後,使用echo命令生成一個列表。