Linux base shell重定向詳解
一、標準輸入,標準輸出與標準錯誤輸出
在linux shell執(zhí)行命令時,每個進程都和三個打開的文件相聯(lián)系,并使用文件描述符來引用這些文件。由于文件描述符不容易記憶,shell同時也給出了相應的文件名:
| 文件 | 文件描述符 |
| 輸入文件—標準輸入 | 0(缺省是鍵盤,為0時是文件或者其他命令的輸出) |
| 輸出文件—標準輸出 | 1(缺省是屏幕,為1時是文件) |
| 錯誤輸出文件—標準錯誤 | 2(缺省是屏幕,為2時是文件) |
標準輸入:從鍵盤輸入數(shù)據(jù),即從鍵盤讀入數(shù)據(jù)。
標準輸出:把數(shù)據(jù)輸出到終端上。
標準錯誤輸出:把標準錯誤輸出到終端上。
默認的標準輸入指的是鍵盤,默認的標準輸出與標準錯誤輸出指的是屏幕或者是終端。
系統(tǒng)為這三個文件分配了文件標識符fd(file descripter).
在Linux系統(tǒng)下,一切皆是文件,對文件的操作,一般要用到文件標識符。它們的文件標識符,分別為0,1,2。他們的關系如下表:
| 文件描述符 | 名稱 | 通用縮寫 | 默認值 |
|---|---|---|---|
| 0 | 標準輸入 | stdin | 鍵盤 |
| 1 | 標準輸出 | stdout | 屏幕 |
| 2 | 標準錯誤 | stderr | 屏幕 |
二.文件重定向:改變程序運行的輸入來源和輸出地點
1.輸出重定向:
| Command > filename | 把標準輸出重定向到一個新文件中 |
| Command >> filename | 把標準輸出重定向到一個文件中(追加) |
| Command > filename | 把標準輸出重定向到一個文件中 |
| Command > filename 2>&1 | 把標準輸出和錯誤一起重定向到一個文件中 |
| Command 2 > filename | 把標準錯誤重定向到一個文件中 |
| Command 2 >> filename | 把標準輸出重定向到一個文件中(追加) |
| Command >> filename2>&1 | 把標準輸出和錯誤一起重定向到一個文件(追加) |
2.輸入重定向:
| Command < filename > filename2 | Command命令以filename文件作為標準輸入,以filename2文件作為標準輸出 |
| Command < filename | Command命令以filename文件作為標準輸入 |
| Command << delimiter | 從標準輸入中讀入,知道遇到delimiter分界符 |
3.綁定重定向
| Command >&m | 把標準輸出重定向到文件描述符m中 |
| Command < &- | 關閉標準輸入 |
| Command 0>&- | 同上 |
三、使用實例
cmd > file
#說明: 將 cmd 的輸出發(fā)送到 file 文件(覆蓋模式)
cmd >> file
#說明: 將 cmd 的輸出發(fā)送到 file 文件(追加模式)
cmd < file
#說明: 以 file 文件的內(nèi)容作為 cmd 的輸入
cmd << text
#說明: 嵌入文件(here document, 類似于PHP語法)形式的輸入
#shell 可在行內(nèi)輸入中做變量、命令和算術(shù)替換
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 >| file
#說明: 強制以覆蓋方式將 cmd 的輸出發(fā)送到 file 文件
#即便 shell 設置了 noclobber 選項也是如此
cmd >&n
#說明: 將 cmd 的輸出發(fā)送到文件描述符 n
cmd m>&n
#說明: 作用同上。將本該輸出到文件描述符 m 的內(nèi)容, 發(fā)送到文件描述符 n
cmd >&-
#說明: 關閉標準輸出
cmd <&n
#說明: 從文件描述符 n 處獲取內(nèi)容作為 cmd 命令的輸入
cmd m<&n
#說明: 作用同上。除了本該從文件描述符 m 處獲取輸入,改為從文件描述符 n 處獲取
cmd <&-
#說明: 關閉標準輸入
cmd <&n-
#說明: 通過復制移動文件操作符 n 為標準輸入并且關閉原始輸入
cmd >&n-
#說明: 通過復制移動文件操作符 n 為標準輸出并且關閉原始輸出
cmd 2>file
#說明: 將標準錯誤輸出發(fā)送到文件 file
cmd > file 2>&1
#說明: 將標準輸出發(fā)送到文件 file, 將標準錯誤發(fā)送到文件描述符 1, 也即 file 文件
cmd >& file
#說明: 將標準輸出和標準錯誤都發(fā)送到文件 file (作用同上)
cmd &> file
#說明: 作用同上, 更好的格式
cmd &>> file
#說明: 將標準錯誤和標準輸出發(fā)送到文件 file (追加模式)
cmd > f1 2> f2
#說明: 將標準輸出發(fā)送到文件 f1, 將標準錯誤發(fā)送到文件 f2
cmd | tee files
#說明: 發(fā)送 cmd 的輸出到標準輸出 (通常為終端) 和 文件 files
cmd 2>&1 | tee files
#說明: 發(fā)送 cmd 的輸出和錯誤到標準輸出 (通常為終端) 和 文件 files
cmd |& tee files
#說明: 作用同上
四、shell重定向的一些高級用法
1.重定向標準錯誤
例子1:
如果command執(zhí)行出錯,將錯誤的信息重定向到空設備
例子2:
將command執(zhí)行的標準輸出和標準錯誤重定向到out.put(也就是說不管command執(zhí)行正確還是錯誤,輸出都打印到out.put)。
2.exec用法
exec命令可以用來替代當前shell;換句話說,并沒有啟動子shell,使用這一條命令時任何現(xiàn)有環(huán)境變量將會被清除,并重新啟動一個shell(重新輸入用戶名和密碼進入)。
其中,command通常是一個shell腳本。
對文件描述符操作的時候用(也只有再這時候),它不會覆蓋你當前的shell
例子1:
#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內(nèi)容重定向到文件描述符0,實際上就是把文件name.txt中的內(nèi)容重定向到文件描述符3。然后通過exec打開文件描述符3;
然后,通過read命令讀取name.txt的第一行內(nèi)容line1,第二行內(nèi)容line2,通過Exec 0<&3關閉文件描述符3;
最后,用echo命令輸出line1和line2。最好在終端運行一下這個腳本,親自嘗試一下。
例子2:
#打開test.sh可讀寫操作,與文件描述符3綁定
while read line<&3
do
echo $line;
done
#循環(huán)讀取文件描述符3(讀取的是test.sh內(nèi)容)
exec 3<&-
#關閉文件的,輸入,輸出綁定
五、bash shell 重定向的幾個特殊文件
| 文件 | 說明 |
|---|---|
| /dev/stdin | 文件描述符 0 的復制品 |
| /dev/stdout | 文件描述符 1 的復制品 |
| /dev/stderr | 文件描述符 2 的復制品 |
| /dev/fd/n | 文件描述符 n 的復制品 |
| /dev/tcp/host/port | Bash 在 port 打開到 host 的 TCP 連接 |
| /dev/udp/host/port | Bash 在 port 打開到 host 的 UDP 連接 |
相關文章
Shell腳本獲取國內(nèi)各大運營商網(wǎng)段腳本分享
這篇文章主要介紹了Shell腳本獲取國內(nèi)各大運營商網(wǎng)段腳本分享,本文使用亞太地區(qū)網(wǎng)絡信息記錄作為數(shù)據(jù)源,然后使用Shell腳本分析國內(nèi)的網(wǎng)段,需要的朋友可以參考下2014-12-12
檢測網(wǎng)站down掉后自動發(fā)信的shell腳本代碼
腳本用途:檢測指定文件中的網(wǎng)站url,當一個網(wǎng)站down掉后,自動給指定的郵箱發(fā)信2013-02-02
Shell腳本實現(xiàn)在Linux系統(tǒng)中自動安裝JDK
這篇文章主要介紹了Shell腳本實現(xiàn)在Linux系統(tǒng)中自動安裝JDK,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下2015-01-01
linux shell實現(xiàn)批量主機遠程執(zhí)行命令腳本
這篇文章主要介紹了linux shell實現(xiàn)批量主機遠程執(zhí)行命令腳本,文章通過代碼示例講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-09-09
linux?shell中Grep命令查找多個字符串(grep同時匹配多個關鍵字或任意關鍵字)
grep是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹配的行打印出來,下面這篇文章主要給大家介紹了關于linux?shell中Grep命令查找多個字符串(grep同時匹配多個關鍵字或任意關鍵字)的相關資料,需要的朋友可以參考下2022-08-08

