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