重定向能夠實現Linux命令的輸入輸出與文件之間重定向,以及實現將多個命令組合起來實現更加強大的命令。這部分涉及到的比較多的命令主要有:
cat:連接文件 sort:排序文本行 uniq:忽略或者報告重復行
wc:統計文件的行數、詞數、位元組數
grep:列印匹配製定模式的行
head:輸出文件的頭部 tail:輸出文件的尾部
tee:從標准輸入讀,並往標准輸出或者文件寫
重定向標准輸出
使用>可以將本來出現在屏幕的標准輸出信息重定向到一個文件中。
使用>>可以在實現重定向時不覆蓋原有內容,而是在文件末尾追加內容。
重定向標准錯誤信息到文件
使用文件描述符,在shell中,默認用數字0,1,2分別代表標准輸入、標准輸出、標准錯誤。
屏蔽不想看到的信息
Linux中有一個特殊的文件/dev/null,這個文件叫做bit bucket,可以接受輸入信息但是什麼都不做。例如:ls/usr/> /dev/null
重定向標准輸入
cat命令可以接受一組文件為參數,將這些文件復制到標准輸出。我們前面的例子中已經多次使用到cat命令來將文本文件的內容讀取到屏幕上。cat還有一個很重要的功能:接受一組文件,然後通過重定向將他們重新組合到一個文件中。
cat ls1 ls2 > ls這個命令將ls1和ls2文件中的內容合並到ls文件中了。cat命令的這種功能不僅僅適用於文本文件,同樣對二進制文件有效。這個場景主要在將多個壓縮包文件合並到一個壓縮包中用到。
cat也可以不傳遞參數,這種情況下,cat會重定向標准輸入到標准輸出。
管道
Linux提供|操作符,該操作符可以將一個命令的輸出作為另一個命令的輸入,這樣通過多個命令的協作來完成一些比較復雜的內容。比如,我們可以通過uniq命令來排除重復的行。但是uniq命令往往需要和sort命令配合使用。因為uniq接收一組排好序的文本,而剛好sort可以將文本行排序。
2. Linux標准輸入輸出與重定向詳解|果斷收藏
linux中的>、>>、<、<<、2>、2>>、2>&1、&>、&<,總歸要面對的
為了更好的理解這個問題,我們需要追本溯源。
執行一個shell命令行時通常會自動打開三個標准文件
(1) 、標准輸入文件(stdin)
通常對應終端的鍵盤。
(2)、標准輸出文件(stdout)。
(3)、標准錯誤輸出文件(stderr)。
(2)和(3)這兩個文件都對應終端的屏幕。
進程將從標准輸入文件中得到輸入數據。
將正常輸出數據輸出到標准輸出文件[顯示器]。
將錯誤信息送到標准錯誤文件中[顯示器]。
下圖所示:
0、1、2表示一個文件描述符
但是,有時候我們不想把一些進程處理後信息輸出到顯示器。
這時我們就引出了重定向。
改變標准輸入/輸出的方向
三種重定向:
1、重定向標准輸出,包括兩種。
(1)、>(覆蓋),等價1>
將命令執行的結果輸出到指定文件,非顯示器。
(2) 、>>(追加),等價1>>
將命令執行的結果追加到指定文件,非顯示器。
2、 重定向標准輸入,包括兩種。
(1) 、<
將命令中接收的輸入途徑,由鍵盤改為指定文件。
(2) 、<<[Here Document]
命令序列傳遞到一個交互程序或者命令中。
3、 重定向標准錯誤,包括兩種。
(1) 、2>(覆蓋)
將命令執行的結果輸出到指定文件。
(2) 、2>>(追加)
將命令執行的結果追加到指定文件。
1、重定向標准輸出和重定向標准錯誤到同一個文件中
有以下的幾種方式
(1) 、2>&1
(2) 、>&
(3) 、&>
2、 兩個特殊文件
(1) 、/dev/nul
過濾標准錯誤信息
意思就是不想顯示結果就輸出到這裡面。
(2) 、/dev/zero
創建指定長度的文件
案例1:
測試> and >>
案例2:
測試< and <<
測試<
測試<<
案例3:
測試2> and 2>>
案例4:
測試重定向標准輸出和重定向標准錯誤到同一個文件中
(1)、>&
(2)、&>
與上面的案例類似,不做解釋
(3) 、2>&1
案例5:
使用/dev/nul文件
有時候我們使用命令,不想將輸出的信息顯示到界面
這時我們可以使用 &> /dev/nul[常用]
簡單測試修改demo 用戶密碼
3. Linux 重定向符號以及2>&1
一個進程默認會打開標准輸入、標准輸出、錯誤輸出三個文件描述符
文件描述符為薯野0,小於號表示數據由文件流入命令
usage:
命令 < file
#加入輸入重定向,對輸入文件進行計數
wc -l < /etc/passwd
文件描述符為1,大於號表述數據由命令流入文件
所以: echo "hello" > t.log 也可以寫成 echo "hello" 1 > t.log
> 會把文件的內容清空,再輸入到新的文件
>> 會把當前內容保持不變,然後在下一行進首手備行追加
2> 錯誤重定向,如果當前命令產生了錯誤,會把錯誤重定向到文件中,而不會列印到屏幕
&> 無論內容正確還是錯誤都會把文件輸出到文件中。
stderr的文件描述符為2,Unix程序會向stderr流中寫入錯誤信息。
默認情況下, command > file 將stdout 重定向到 file, command < file 將stdin 重定向到 file。
如果希望 stderr 重定向到 file,可以這樣寫:
$ command 2>file
如果希望 stderr 追加到 file 文件末尾,可以這樣寫:
$ command 2>>file 2 表示標准錯誤文件(stderr)
如果希望將 stdout 和 stderr 合並後重定向到 file,可以這樣寫:
$ command > file 2>&1 或者 $ command >> file 2>&1
如果希望對 stdin 和 stdout 都重定向,可以這樣寫:
$ command < file1 >file2
command 命令將 stdin 重定向到 file1,將 stdout 重定向到 file2。
含義:將標准錯誤輸出 重定向到 標准輸出。
符號>&是一個整體,不可分開,分開後就不是上述含義了。
比如有些人可能會這么想:2是標准錯誤輸入,1是標准輸出,>是重定向符號,那麼"將標准錯誤輸出重定向到標准輸出"是不是就應該寫成者毀"2>1"就行了?是這樣嗎? 如果是嘗試過,你就知道2>1的寫法其實是將標准錯誤輸出重定向到名為"1"的文件里去了
4. linux被人重定向輸出本機如何攔截
Linux系統可以通過配置防火牆來攔截被重定向的老孝輸出。首先,需要安裝iptables,iptables是Linux的內置防火牆,可以攔截指定的網路流量斗埋。其次,使用iptables配置防火牆,在防火牆中添加規則,規定攔截特定的網路流量,如被重定向的輸出。最後,使用iptables激活防火牆,使其生效,從而攔截被重定向的空含螞輸出。
5. LINUX 標准錯誤輸出重定向
用途:不掛斷地運行命令。
語法:飢掘nohup Command [ Arg … ] [& ]
無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 文件中。
如果當前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out 文件中。
如果沒有文件能創建或打開以用於追加,那滑晌么 Command 參數指定的命令不可調用。
退出狀態:該命令返回下列出口值:
126 可以查找但不能調用 Command 參數指定的命令。
127 nohup 命令發生錯誤或不能查找由 Command 參數指定的命令。
否則,nohup 命令的退出狀態是 Command 參數指定命令的退出狀態。
用途:在後台運行
一般兩個一起用
3.為什麼呢 2>&1 要寫在後面?
首先是command > file將標准輸出重定向到file中, 2>&1 是標准錯誤拷貝了標准輸出的行為,也就是同樣被重定向到file中,最終結果就是標准輸出和錯誤都被重定向到file中。
2>&1 標准錯誤拷貝了標准輸出的行為,但此時標准輸出還是在終端。>file 後輸出才被重定向到file,但標准錯誤仍然保持在終端。
用strace可以看到:
這個命令中實現重定向的關鍵系統爛讓核調用序列是:
open(file) == 3
p2(3,1)
p2(1,2)
這個命令中實現重定向的關鍵系統調用序列是:
p2(1,2)
open(file) == 3
p2(3,1)
注意:0 是標准輸入(STDIN),1 是標准輸出(STDOUT),2 是標准錯誤輸出(STDERR)。
這里的2和>之間不可以有空格,2>是一體的時候才表示錯誤輸出。
6. linux bash的重定向
關於linux bash的重定向
所謂I/O重定向簡單來說就是一個過程,這個過程捕捉一個文件,或者命令,程序,腳本,甚至腳本中的代碼塊(code block)的輸出,然後把捕捉到的輸出,作為輸入發送給另外一個文件,命令,程序,或者腳本。
如果談到I/O重定向,就涉及到文件標識符(File Descriptor)的概念, 在Linux系統中,系統為每一個打開的文件指定一個文件標識符以便系統對文件進行跟蹤,這里有些和C語言編程里的文件句柄相似,文件標識符是一個數字,不同數字代表不同姿擾純的含義,默認情況下,系統佔用跡咐了3個,分別是0標准輸入(stdin),1標准輸出(stdout), 2標准錯誤(stderr), 另外3-9是保留的標識符,可以把這些標識符指定成標准輸入,輸出或者錯誤作為臨時連接。通常這樣可以解決很多復雜的重定向請求。
標准輸入通常指鍵盤的輸入
標准輸出通常指顯示器的輸出
標准錯誤通常也是定向到顯示器
請看以下例子,來描述一下他們的關系
#ls /dev
這個命令列出/dev目錄下的所有文件,在屏幕上輸出結果。
這里 /dev 就是作為命令ls的標准輸入(從鍵盤輸入),而列印在屏幕的結果就是標准輸出(/dev目錄中的內容)
還是回到標題,重定向就是把標準的`輸入或者輸出更改成其他的方式,請參看如下例子
或者等同於
#ls /dev 1>filename #注意:"1"和">"中間沒有空格
以上命令會把命令的標准輸出重新定向到一個文件filename,而不是顯示到屏幕上,如果不指明文件標識符,系統默認的就是1, 因此1可以省略
如果把上面例子重的">"改成">>"則表示把輸出追加到filename文件的末尾,如果文件不存在則創建它。如下
#ls /dev >>filename
也可以把標准錯誤重新定向到文件
#ls -qw /dev 2>filename
顯然 -qw是一個錯誤參數,通常會在顯示器上報告一個錯誤信息,但由於把2標准錯誤(stderr)重新定向到了文件filename,因此顯示器沒有錯誤信息,而信息寫到了文件裡面
以下命令是把標准輸出和錯誤都定向到文件
#ls /dev &>filename
"&"在這里代表標准輸出和標准錯誤,這里無論是正常輸出還是錯誤信息都寫到filename中了。
重新定義標准輸入,輸出,和錯誤的文件標識符
重新定義文件標識符可以用i>&j命令,表示把文件標識符i重新定向到j,你可以把"&"理解為"取地址"
請看以下例子
#exec 5>&1
表示把文件標識符5定向到標准輸出,這個命令通常用來臨時保存標准輸入。
同樣標准輸入也是可以重新定向的,請參考下面例子
# grep search-word
一般來說grep命令在給定文件中搜索字元串,以上命令把文件filename作為grep命令的標准輸入,而不是從鍵盤輸入。
前面曾經提到,系統為每一個打開的文件指定一個文件標識符以便系統對文件進行跟蹤,那麼默認的文件標識符是什麼呢?答案是0,也就是標准輸入,或者可以說從鍵盤輸入。當然這個文件標識符也可以自己指定,請參考下面例子
#echo 123456789 >filename 把字元串寫到文件filename中 #exec 3<>filename 把文件filename打開,並指定文件標識符為3 #read -n 4 <&3 從文件中讀4個字元,句柄已經指到第四個字元末尾 #echo -n . >&3 在第李斗5個字元處寫一個點,覆蓋第5個字元,-n表示不換行 #exec 3>&- 關閉文件標識符3
現在cat filename文件的結果就成了1234.6789
命令j<>filename表示把文件打開,並指明文件標識符為j
"&-"表示關閉文件標識符
有關關閉文件標識符的操作請參考下面
n<&- 關閉輸入文件標識符n 0<&-或<&- 關閉標准輸入stdin n>&- 關閉輸出文件標識符n 1>&-或>&-關閉標准輸出stdout
另外還有一些其他命令,如下參考
2. :> filename 或者 > filename
表示把文件filename設置成空,也就是清空文件內容,如果文件不存在,則創建一個空文件,(等同於touch命令) :表示一個空輸出,兩個命令的唯一區別就是>filename不是在所有shell都可以正常工作的。
7. linux輸出重定向到文件命令
輸出即把相關對象通過輸出設備(顯示器等)顯示出來,輸出又分正確輸出和錯誤輸出
一般情況下標准輸出設備為顯示器,標准輸入設備為鍵盤。
命令 >> 文件 2>&1 和 命令 &>>文件 兩個命令作用相同
系統有個常見用法 ls &>/dev/null 正確輸出或錯誤輸出結果都不要。(null可以理解為黑洞或垃圾站)
命令>>文件1 2>>文件2 正確日誌和錯誤日誌分開保存
例:nohup java -jar /usr/sbin/lb-agent.jar >>/var/log/lb-agent.log 2>&1 &
將jar執行的結果寫入到lb-agent.log中
在命令最後加上&符號,表示讓這個進程到後台去執行,這樣立刻返回到提示符狀態,我們可以接著做下面的事。如:command &。
這種「後台」進程在shell一直打開的情況下是沒有問題的,如果我們關了shell窗口甚至退出ssh登錄或vnc登錄,那麼進程自動就結束了。所以如果想退出窗口乃至退出登錄仍然保持程序運行,再加上nohup,形如:nohup command 1>output 2>&1 &《Linux就該這么學》學習更多linux知識。
8. linux 如何把一個程序的所有輸出內容重定向,程序A調用庫函數B,如何運行A時console不輸出任何列印信息
直接使用輸復出重定向到你想要的文製件即可,不過將所有的控制到信息輸出到一個文本文件,只有兩個辦法:
①:修改所有程序的輸出路徑:printf函數 echo.....幾乎是不可能完成的任務
②:修改linux的標准輸出路徑:
句柄 句柄的數字代號 描述
STDIN 0 鍵盤輸入
STDOUT 1 輸出到命令提示符窗口
STDERR 2 錯誤輸出到命令提示符窗口
將標准輸出 標准輸出的默認設置更改為你要保存的文件,這樣就會控制台的信息就會輸出到你指定的文件裡面
9. linux輸出重定向>和>>的區別是什麼
>和>>其實都屬於輸出重定向,都可以輸出內容到指定文件。
具體的區別如下:
>會覆蓋目標的原有內容,當文件存在時,會先刪除原文件,再重新創建文件,然後把內容寫入該文件,否則直接創建文件。
>>會在目標原有內容後追加內容,當文件存在時直接在文件末尾進行內容追加,不會刪除原文件,否則直接創建文件。
10. linux系統中輸出重定向是指
Linux下默認有兩種輸出流:
1 - 標准輸出流
2 - 標准錯誤輸出流
Linux下一切皆文件,這里的1和2表示的就是輸出設備文件的文件描述符。
默認情況下,無論是標准輸出還是標准錯誤輸出,都是輸出到終端顯示的。
但也可以通過重定向輸出到其他地方,如文件。這就是輸出重定向。
並且,這兩種輸出流可以被分別重定向。
下面舉例:
假設文件file.txt在當前目錄下並不存在,執行下面的命令:
ls file.txt 2>log.txt
這樣就將錯誤輸出重定向到文件log.txt中。
ls file.txt 2>/dev/null
這樣就什麼都看不到,將標准錯誤輸出流重定向到/dev/null中,丟棄了。
ls file.txt >/dev/null
只將標准輸出重定向到/dev/null中,這樣仍然可以在終端窗口看到錯誤輸出。
註:>/dev/null 等同於 1>/dev/null,前面的1可省略。
由於問題比較具體建議對照劉遄老師的《Linux就該這么學》