關(guān)于linux bash的重定向
在西平等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,全網(wǎng)整合營銷推廣,成都外貿(mào)網(wǎng)站制作,西平網(wǎng)站建設(shè)費用合理。
所謂I/O重定向簡單來說就是一個過程,這個過程捕捉一個文件,或者命令,程序,腳本,甚至腳本中的代碼塊(code block)的輸出,然后把捕捉到的輸出,作為輸入發(fā)送給另外一個文件,命令,程序,或者腳本。
如果談到I/O重定向,就涉及到文件標識符(File Descriptor)的概念, 在Linux系統(tǒng)中,系統(tǒng)為每一個打開的文件指定一個文件標識符以便系統(tǒng)對文件進行跟蹤,這里有些和C語言編程里的文件句柄相似,文件標識符是一個數(shù)字,不同數(shù)字代表不同的含義,默認情況下,系統(tǒng)占用了3個,分別是0標準輸入(stdin),1標準輸出(stdout), 2標準錯誤(stderr), 另外3-9是保留的標識符,可以把這些標識符指定成標準輸入,輸出或者錯誤作為臨時連接。通常這樣可以解決很多復(fù)雜的重定向請求。
標準輸入通常指鍵盤的輸入
標準輸出通常指顯示器的輸出
標準錯誤通常也是定向到顯示器
請看以下例子,來描述一下他們的關(guān)系
#ls /dev
這個命令列出/dev目錄下的所有文件,在屏幕上輸出結(jié)果。
這里 /dev 就是作為命令ls的標準輸入(從鍵盤輸入),而打印在屏幕的結(jié)果就是標準輸出(/dev目錄中的內(nèi)容)
還是回到標題,重定向就是把標準的`輸入或者輸出更改成其他的方式,請參看如下例子
或者等同于
#ls /dev 1filename #注意:"1"和""中間沒有空格
以上命令會把命令的標準輸出重新定向到一個文件filename,而不是顯示到屏幕上,如果不指明文件標識符,系統(tǒng)默認的就是1, 因此1可以省略
如果把上面例子重的""改成""則表示把輸出追加到filename文件的末尾,如果文件不存在則創(chuàng)建它。如下
#ls /dev filename
也可以把標準錯誤重新定向到文件
#ls -qw /dev 2filename
顯然 -qw是一個錯誤參數(shù),通常會在顯示器上報告一個錯誤信息,但由于把2標準錯誤(stderr)重新定向到了文件filename,因此顯示器沒有錯誤信息,而信息寫到了文件里面
以下命令是把標準輸出和錯誤都定向到文件
#ls /dev filename
""在這里代表標準輸出和標準錯誤,這里無論是正常輸出還是錯誤信息都寫到filename中了。
重新定義標準輸入,輸出,和錯誤的文件標識符
重新定義文件標識符可以用ij命令,表示把文件標識符i重新定向到j(luò),你可以把""理解為"取地址"
請看以下例子
#exec 51
表示把文件標識符5定向到標準輸出,這個命令通常用來臨時保存標準輸入。
同樣標準輸入也是可以重新定向的,請參考下面例子
# grep search-word
一般來說grep命令在給定文件中搜索字符串,以上命令把文件filename作為grep命令的標準輸入,而不是從鍵盤輸入。
前面曾經(jīng)提到,系統(tǒng)為每一個打開的文件指定一個文件標識符以便系統(tǒng)對文件進行跟蹤,那么默認的文件標識符是什么呢?答案是0,也就是標準輸入,或者可以說從鍵盤輸入。當然這個文件標識符也可以自己指定,請參考下面例子
#echo 123456789 filename 把字符串寫到文件filename中 #exec 3filename 把文件filename打開,并指定文件標識符為3 #read -n 4 3 從文件中讀4個字符,句柄已經(jīng)指到第四個字符末尾 #echo -n . 3 在第5個字符處寫一個點,覆蓋第5個字符,-n表示不換行 #exec 3- 關(guān)閉文件標識符3
現(xiàn)在cat filename文件的結(jié)果就成了1234.6789
命令jfilename表示把文件打開,并指明文件標識符為j
"-"表示關(guān)閉文件標識符
有關(guān)關(guān)閉文件標識符的操作請參考下面
n- 關(guān)閉輸入文件標識符n 0-或- 關(guān)閉標準輸入stdin n- 關(guān)閉輸出文件標識符n 1-或-關(guān)閉標準輸出stdout
另外還有一些其他命令,如下參考
2. : filename 或者 filename
表示把文件filename設(shè)置成空,也就是清空文件內(nèi)容,如果文件不存在,則創(chuàng)建一個空文件,(等同于touch命令) :表示一個空輸出,兩個命令的唯一區(qū)別就是filename不是在所有shell都可以正常工作的。
;
[Linux]入門
[Linux]目錄結(jié)構(gòu)
[Linux]vi,vim
[Linux]開機、重啟和用戶登錄注銷
[Linux]用戶管理篇:創(chuàng)建用戶指定密碼
[Linux]用戶管理篇:刪除用戶
[Linux]用戶管理篇:組的管理
[Linux] 實用指令:運行級別和找回root密碼
[Linux] 實用指令:幫助指令
[Linux]實用指令: pwd、ls、cd
[Linux]實用指令:mkdir、rmdir、touch
[Linux]實用指令:cp、 rm、mv
[Linux]實用指令: cat、more、less
[Linux]實用指令:重定向、追加
[Linux]實用指令:echo、head 、tail
[Linux]實用指令:ln 、history
1.
標準輸入的控制
語法:命令
文件將命令的執(zhí)行結(jié)果送至指定的文件中。
例如:
ls
-l
list
將執(zhí)行l(wèi)s
-l
命令的結(jié)果寫入文件list
中。
語法:命令!
文件將命令的執(zhí)行結(jié)果送至指定的文件中,若文件已經(jīng)存在,則覆蓋。
例如:
ls
-lg
!
list
將執(zhí)行l(wèi)s
-
lg
命令的結(jié)果覆蓋寫入文件list
中。
語法:命令
文件將命令執(zhí)行時屏幕上所產(chǎn)生的任何信息寫入指定的文件中。
例如:
cc
file1.c
error
將編譯file1.c
文件時所產(chǎn)生的任何信息寫入文件error
中。
語法:命令
文件將命令執(zhí)行的結(jié)果附加到指定的文件中。
例如:
ls
-
lag
list
將執(zhí)行l(wèi)s
-
lag
命令的結(jié)果附加到文件list
中。
語法:命令
文件將命令執(zhí)行時屏幕上所產(chǎn)生的任何信息附加到指定的文件中。
例如:
cc
file2.c
error
將編譯file2.c
文件時屏幕所產(chǎn)生的任何信息附加到文件error
中。
3.
命令語法
一個進程默認會打開標準輸入、標準輸出、錯誤輸出三個文件描述符
文件描述符為0,小于號表示數(shù)據(jù)由文件流入命令
usage:
命令 file
#加入輸入重定向,對輸入文件進行計數(shù)
wc -l /etc/passwd
文件描述符為1,大于號表述數(shù)據(jù)由命令流入文件
所以: echo "hello" t.log 也可以寫成 echo "hello" 1 t.log
會把文件的內(nèi)容清空,再輸入到新的文件
會把當前內(nèi)容保持不變,然后在下一行進行追加
2 錯誤重定向,如果當前命令產(chǎn)生了錯誤,會把錯誤重定向到文件中,而不會打印到屏幕
無論內(nèi)容正確還是錯誤都會把文件輸出到文件中。
stderr的文件描述符為2,Unix程序會向stderr流中寫入錯誤信息。
默認情況下, command file 將stdout 重定向到 file, command file 將stdin 重定向到 file。
如果希望 stderr 重定向到 file,可以這樣寫:
$ command 2file
如果希望 stderr 追加到 file 文件末尾,可以這樣寫:
$ command 2file 2 表示標準錯誤文件(stderr)
如果希望將 stdout 和 stderr 合并后重定向到 file,可以這樣寫:
$ command file 21 或者 $ command file 21
如果希望對 stdin 和 stdout 都重定向,可以這樣寫:
$ command file1 file2
command 命令將 stdin 重定向到 file1,將 stdout 重定向到 file2。
含義:將標準錯誤輸出 重定向到 標準輸出。
符號是一個整體,不可分開,分開后就不是上述含義了。
比如有些人可能會這么想:2是標準錯誤輸入,1是標準輸出,是重定向符號,那么"將標準錯誤輸出重定向到標準輸出"是不是就應(yīng)該寫成"21"就行了?是這樣嗎? 如果是嘗試過,你就知道21的寫法其實是將標準錯誤輸出重定向到名為"1"的文件里去了