1. 程式人生 > >linux shell 重定向

linux shell 重定向

之前對shell重定向的瞭解是模稜兩可的,遇到重定向相關的知識總是需要翻書或者google,因此在這裡總結一下shell的重定向

一 輸出重定向

> 表示覆蓋; >> 表示追加

Command > filename把標準輸出重定向到一個新檔案中(此命令等價於:Command 1> filename. #注意:"1"和">"中間沒有空格. 系統預設的就是1, 因此1可以省略 
Command >> filename把標準輸出重定向到一個檔案中(追加)
Command > filename把標準輸出重定向到一個檔案中
Command > filename 2>&1把標準輸出和錯誤一起重定向到一個檔案中
Command 2> filename把標準錯誤重定向到一個檔案中
Command 2>> filename把標準輸出重定向到一個檔案中(追加)(注意:2和>>中間沒有空格


Command >> filename 2>&1把標準輸出和錯誤一起重定向到一個檔案(追加)

二 輸入重定向

Command < filename > filename2    Command命令以filename檔案作為標準輸入,以filename2檔案作為標準輸出
Command < filenameCommand命令以filename檔案作為標準輸入
Command << delimiter從標準輸入中讀入,直到遇到delimiter分界符(delimiter為結束輸入的標誌

三 繫結重定向

Command >&m把標準輸出重定向到檔案描述符m中(即等價於Command 1>&m)
Command < &-關閉標準輸入
Command 0>&-同上

例項

<span style="font-family:Microsoft YaHei;font-size:14px;">cmd > file
#說明: 將 cmd 的輸出傳送到 file 檔案(覆蓋模式)
cmd >> file
#說明: 將 cmd 的輸出傳送到 file 檔案(追加模式)
cmd < file
#說明: 以 file 檔案的內容作為 cmd 的輸入
cmd << text
#說明: 嵌入檔案(here document, 類似於PHP語法)形式的輸入
#shell 可在行內輸入中做變數、命令和算術替換
cmd <<- text
#說明: 作用同上, 不過會自動刪除here document中每行開頭的製表符Tab
cmd <<< word
#說明: here string 格式的輸入
#參見: http://bash.cyberciti.biz/guide/Here_strings
#參見: http://linux.die.net/abs-guide/x15683.html
cmd <> file
#說明: 以讀寫方式開啟檔案 file
cmd 5<>file
#說明:在檔案描述符5上開啟檔案file以供讀寫
cmd >| file
#說明: 強制以覆蓋方式將 cmd 的輸出傳送到 file 檔案
#即便 shell 設定了 noclobber 選項也是如此
cmd >&n
#說明: 將 cmd 的輸出傳送到檔案描述符 n
cmd m>&n
#說明: 作用同上。將本該輸出到檔案描述符 m 的內容, 傳送到檔案描述符 n
cmd >&-
#說明: 關閉標準輸出
cmd <&n
#說明: 從檔案描述符 n 處獲取內容作為 cmd 命令的輸入
cmd m<&n
#說明: 作用同上。除了本該從檔案描述符 m 處獲取輸入,改為從檔案描述符 n 處獲取
cmd <&-
#說明: 關閉標準輸入
cmd <&n-
#說明: 通過複製移動檔案操作符 n 為標準輸入並且關閉原始輸入
cmd >&n-
#說明: 通過複製移動檔案操作符 n 為標準輸出並且關閉原始輸出
cmd 2>file
#說明: 將標準錯誤輸出傳送到檔案 file
cmd  > file 2>&1
#說明: 將標準輸出傳送到檔案 file, 將標準錯誤傳送到檔案描述符 1, 也即 file 檔案
cmd  >& file
#說明: 將標準輸出和標準錯誤都發送到檔案 file (作用同上)
cmd  &> file
#說明: 作用同上, 更好的格式
cmd  &>> file
#說明: 將標準錯誤和標準輸出傳送到檔案 file (追加模式)
cmd  > f1 2> f2
#說明: 將標準輸出傳送到檔案 f1, 將標準錯誤傳送到檔案 f2
cmd  | tee files
#說明: 傳送 cmd 的輸出到標準輸出 (通常為終端) 和 檔案 files
cmd 2>&1 | tee files
#說明: 傳送 cmd 的輸出和錯誤到標準輸出 (通常為終端) 和 檔案 files
cmd |& tee files
#說明: 作用同上</span>

四 shell重定向的一些高階用法
command 2> /dev/null

將標準錯誤重定向到空裝置(黑洞裝置)

command > out.put 2>&1

將command執行的標準輸出和標準錯誤重定向到out.put(也就是說不管command執行正確還是錯誤,輸出都列印到out.put)

exec用法
exec命令可以用來替代當前shell;換句話說,並沒有啟動子shell,使用這一條命令時任何現有環境變數將會被清除,並重新啟動一個shell(重新輸入使用者名稱和密碼進入)

其中,command通常是一個shell指令碼。
對檔案描述符操作的時候用(也只有再這時候),它不會覆蓋你當前的shell
例子1:

#!/bin/bash
#file_desc

exec 3<&0 0<name.txt
read line1
read line2
exec 0<&3
echo $line1
echo $line2
其中:首先,exec 3<&0 0<name.txt的意思是把標準輸入重定向到檔案描述符3(0表示標準輸入),然後把檔案name.txt內容重定向到檔案描述符0,實際上就是把檔案name.txt中的內容重定向到檔案描述符3。然後通過exec開啟檔案描述符3;
然後,通過read命令讀取name.txt的第一行內容line1,第二行內容line2,通過Exec 0<&3關閉檔案描述符3;
最後,用echo命令輸出line1和line2。最好在終端執行一下這個指令碼,親自嘗試一下。
例子2
exec 3<>test.sh;
#開啟test.sh可讀寫操作,與檔案描述符3繫結

while read line<&3
 do
    echo $line;
done
#迴圈讀取檔案描述符3(讀取的是test.sh內容)
exec 3>&-
exec 3<&-
#關閉檔案的,輸入,輸出繫結

五 bash shell 重定向的幾個特殊檔案

檔案說明
/dev/stdin檔案描述符 0 的複製品
/dev/stdout檔案描述符 1 的複製品
/dev/stderr檔案描述符 2 的複製品
/dev/fd/n檔案描述符 n 的複製品
/dev/tcp/host/portBash 在 port 開啟到 host 的 TCP 連線
/dev/udp/host/portBash 在 port 開啟到 host 的 UDP 連線

轉自:http://www.jb51.net/article/49014.htm