linux中的、、、、2、2、21、、,總歸要面對的
創(chuàng)新互聯(lián)公司始終堅持【策劃先行,效果至上】的經(jīng)營理念,通過多達十余年累計超上千家客戶的網(wǎng)站建設總結了一套系統(tǒng)有效的全網(wǎng)推廣解決方案,現(xiàn)已廣泛運用于各行各業(yè)的客戶,其中包括:成都隧道混凝土攪拌車等企業(yè),備受客戶好評。
為了更好的理解這個問題,我們需要追本溯源。
執(zhí)行一個shell命令行時通常會自動打開三個標準文件
(1) 、標準輸入文件(stdin)
通常對應終端的鍵盤。
(2)、標準輸出文件(stdout)。
(3)、標準錯誤輸出文件(stderr)。
(2)和(3)這兩個文件都對應終端的屏幕。
進程將從標準輸入文件中得到輸入數(shù)據(jù)。
將正常輸出數(shù)據(jù)輸出到標準輸出文件[顯示器]。
將錯誤信息送到標準錯誤文件中[顯示器]。
下圖所示:
0、1、2表示一個文件描述符
但是,有時候我們不想把一些進程處理后信息輸出到顯示器。
這時我們就引出了重定向。
改變標準輸入/輸出的方向
三種重定向:
1、重定向標準輸出,包括兩種。
(1)、(覆蓋),等價1
將命令執(zhí)行的結果輸出到指定文件,非顯示器。
(2) 、(追加),等價1
將命令執(zhí)行的結果追加到指定文件,非顯示器。
2、 重定向標準輸入,包括兩種。
(1) 、
將命令中接收的輸入途徑,由鍵盤改為指定文件。
(2) 、[Here Document]
命令序列傳遞到一個交互程序或者命令中。
3、 重定向標準錯誤,包括兩種。
(1) 、2(覆蓋)
將命令執(zhí)行的結果輸出到指定文件。
(2) 、2(追加)
將命令執(zhí)行的結果追加到指定文件。
1、重定向標準輸出和重定向標準錯誤到同一個文件中
有以下的幾種方式
(1) 、21
(2) 、
(3) 、
2、 兩個特殊文件
(1) 、/dev/nul
過濾標準錯誤信息
意思就是不想顯示結果就輸出到這里面。
(2) 、/dev/zero
創(chuàng)建指定長度的文件
案例1:
測試 and
案例2:
測試 and
測試
測試
案例3:
測試2 and 2
案例4:
測試重定向標準輸出和重定向標準錯誤到同一個文件中
(1)、
(2)、
與上面的案例類似,不做解釋
(3) 、21
案例5:
使用/dev/nul文件
有時候我們使用命令,不想將輸出的信息顯示到界面
這時我們可以使用 /dev/nul[常用]
簡單測試修改demo 用戶密碼
IO 重定向是為了改變默認輸入、輸出的位置,如默認情況下標準輸出(STDOUT),標準錯誤輸出(STDERR)都是輸出到顯示終端,如對標準輸出、標準錯誤輸出改變其默認輸出位置,可重定向輸出到指定的文件中(實際工作中經(jīng)常這么使用),要重定向就要配合一些語法符號。
文件或目錄的訪問權限分為只讀、只寫、可執(zhí)行三種。
修改文件權限命令:chmod、chgrp、chown。
搞懂「文件所屬者更改及權限的賦予」,涉及關于 chown、chmod、chgrp 命令,結合用例零基礎理解和掌握使用。
輸出重定向 :
我們使用 或者 對輸出進行重定向。 符號的左邊表示文件描述符,如果沒有的話表示1,也就是標準輸出, 符號的右邊可以是一個文件,也可以是一個輸出設備(Linux中萬物皆文件,即設備也是文件)。當使用時,會判斷右邊的文件存不存在,如果存在的話就先刪除,然后創(chuàng)建一個新的文件,不存在的話則直接創(chuàng)建。但是當使用進行追加時,則不會刪除原來已經(jīng)存在的文件。
格式 :
command-line [n] 文件
這條命令意思是:將一條命令執(zhí)行結果(標準輸出,或者錯誤輸出,本來都要打印到屏幕上面的) 重定向其它輸出設備(文件)1,2分別是標準輸出,錯誤輸出。
實例 :
輸入重定向
在理解了輸出重定向之后,理解輸入重定向就會容易得多。對輸入重定向的基本命令如下:
我們使用 對輸入做重定向, 如果符號左邊沒有寫值,那么默認就是0。
格式:
command-line [n] 文件
命令默認從鍵盤獲得的輸入,使用輸入重定向改成從文件,或者其它打開文件以及設備輸入。執(zhí)行這個命令,將標準輸入0,與文件或設備綁定,將由它進行輸入。
實例:
文件描述符的復制表示復制文件描述符到另一個文件描述符中,也就是將該文件描述符重定向到另一個文件描述符所綁定的文件,使用””進行復制。
想必很多人都知道 file 21 的作用,它等價于 file ,表示標準輸出和標準錯誤都重定向到file中。那它和 21 file 有什么區(qū)別呢?
首先解釋 file 21 。這里分兩個過程:先打開file,再將fd=1重定向到file文件上,這樣file文件就成了標準輸出的輸出目標;之后再將fd=2復制于fd=1,而fd=1此時已經(jīng)重定向到file文件上,因此fd=2也重定向到file上。所以,最終的結果是標準輸出重定向到file上,標準錯誤也重定向到file上。
再解釋 21 file 。這里也分兩個過程:先將fd=2復制于fd=1,而此時fd=1重定向的文件是默認的/dev/stdout,所以fd=2也重定向到/dev/stdout;之后再將fd=1重定向到file文件上。也就是說,這里的標準錯誤和標準輸出仍然是分開輸出的,只不過是使用/dev/stdout替代了/dev/stderr,使用file替代了/dev/stdout。所以,最終的結果是標準錯誤輸出到/dev/stdout,即屏幕上,而標準輸出將輸出到file文件中。
可以使用下面的命令來測試 21 file 。第一個ls命令是正確的,結果輸出到/tmp/fff.log中,第二個ls命令是錯誤的,結果將直接輸出到屏幕上。
最后需要說明的是一種特殊情況,如果是 [word] ,且word不是一個數(shù)值,比如 echo haha /tmp/fff.log ,那么 word 和 word 是等價的,都表示 word 21 ,即標準錯誤和標準輸出都重定向同一個目標。參考man bash的”Redirecting Standard Output and Standard Error”段落。
如果在命令中直接改變重定向的位置,那么命令執(zhí)行結束的時候描述符會自動還原。正如上面的ls /boot 21 /tmp/fff.log命令,在ls執(zhí)行結束后,fd=2還原回默認的/dev/stderr,fd=1還原回默認的/dev/stdout。
但是我們可以通過exec程序直接在當前的shell環(huán)境下改變重定向目標,只有在當前shell退出的時候才會釋放描述符的綁定。
Tips :shell的內建命令exec將并不啟動新的shell,而是用要被執(zhí)行命令替換當前的shell進程,并且將老進程的環(huán)境清理掉,而且exec命令后的其它命令將不再執(zhí)行。
不過,要注意一個例外,當exec命令來對文件描述符操作的時候,就不會替換shell,而且操作完成后,還會繼續(xù)執(zhí)行接下來的命令。
例如:下面的命令將標準錯誤fd=2指向fd=3對應的文件上。
因此,我們可能在一段程序執(zhí)行結束后,需要將描述符還原到原來的位置,并關閉不再需要的描述符。畢竟描述符也是資源,是有限的(ulimit -n)。
[n] filename :打開filename,并指定其文件描述符為n,該描述符是可讀、可寫的描述符。若不指定n則默認為0,若filename文件不存在,則先創(chuàng)建filename文件。
文件描述符的移動表示將文件描述符1移動到描述符2上,同時關閉文件描述符1。
[n]digit- :將文件描述符digit代表的輸出文件移動到n上,并關閉digit值的描述符。
[n]digit- :將文件描述符digit代表的輸入文件移動到n上,并關閉digit值的描述符。