重定向和管道

重定向和管道

目錄

1.標準輸入輸出
2.重定向
3.管道
4.重定向到多個目標linux

這裏先說下與重定向和管道密切相關的一個內容,那就是標準輸入輸出。shell

1.標準輸入和輸出

linux中給出了三種有關設備:app

標準輸入:stdin ,由0表示,默認接受來自鍵盤的輸入
標準輸出:stdout,由1表示,默認輸出到終端窗口
標準錯誤:stderr,由2表示,默認輸出到終端窗口code

stdout就是輸出正確的信息,stderr就是輸出的錯誤提示信息。
重定向和管道就是爲了重定向這些輸入和輸出的。blog

2.重定向

重定向有多種形式,能夠重定向輸出到文件,能夠重定向輸出到下個命令,能夠重定向輸入到命令來被使用。進程

1)重定輸出向到文件

>:把stdout重定向到文件,文件內容會被覆蓋
>>:把stdout重定向到文件,文件內容不會被覆蓋,而是在原有基礎上追加內容
2>:把stderr重定向到文件,進行覆蓋。
2>>:把stderr重定向到文件,進行追加。
&>or >& or 2>&1:把stdout和stderr做爲同一個數據流重定向到文件
&>>:把stdout和stderr就是進行重定向追加了
(程序命令;程序命令;...):配合上述格式,能夠合併多個程序命令的stdout和stderr來覆蓋或追加input

爲了防止誤操做來把文件給覆蓋掉,形成數據丟失,能夠經過set 命令來禁止和容許>的覆蓋操做:it

set -C:禁止將內容覆蓋
set +C:容許覆蓋基礎

注意:stdout和stderr分開輸出到不一樣文件時,必須是stdout在前,stderr在後,也就是2>2>>2>&1都須要在正確輸出的後面。
具體的寫法以下:打包

command > /path/to/file.out 2> /path/to/error.out
command >> /path/to/file.all.out 2>>/path/to/error.out
command > /path/to/file.all.out 2>&1 == command &> /path/to/file.all.out == command >& /path/to/file.all.out

2)重定向輸入到命令

使用 <來重定向文件導向給stdin。
某些命令可以接收從文件中導入的stdin
例如:

使用<<終止詞來重定向從鍵盤上輸入的多行內容導向給stdin。
直到終止詞位置的全部文件都發送給stdin。

3.管道

管道符號「|」用來鏈接命令:

command 1 | command 2 | command 3 | ...
上述是將command 1的stdout 發送給command 2的stdin,command 2 的stdout 發送給command 3的stdin,最後command 3的會在當前shell進程的子shell進程中執行出來。
系統默認不支持stderr進行管道轉發,但能夠利用2>&1|& 來實現。
例如:

管道中的-符號的用法:
tar -cvf - /home |tar -xvf -
這條命令是將/home裏的文件打包,但打包的數據沒有記錄到某個文件,而是直接傳送到stdout,通過管道後,將打包的數據送給tar -xvf來執行,後面的這個-就是取的前面的stdout,這樣就不須要使用臨時的文件了。

4.重定向到多個目標:tee

tee命令能夠用到管道中,來保存管道不一樣階段的輸出,能夠用於複雜管道的故障排除,同時查看和記錄階段輸出。

tee - read from standard input and write to standard output and files
tee [OPTION]... [FILE]...
-a, --append:追加數據到文件
-i, --ignore-interrupts : 忽略中斷符號

例如:
command 1 | tee -a file | command 2 把command 1的stdout保存到file中,而且再做爲command 2的stdin

相關文章
相關標籤/搜索