在我們日常linux命令操作中,命令執行的輸入一般是鍵盤輸入,輸出一般是輸出到螢幕,但有時候,我們可能會去讀取檔案裡但資料作為輸入,或者將輸出儲存到檔案裡(比如日誌檔案),這個時候就需要用到資料流重定向。
所謂資料流重定向,就是:1)將某個命令執行後應該要出現在螢幕上的資料傳輸到其它地方,例如檔案或者諸如印表機之類的裝置;2)將原本由鍵盤輸入的資料改由檔案內容來代替
標準輸入(stdin):檔案描述符0,通常指鍵盤的輸入 。使用符號《或<<
標準輸出(stdout):檔案描述符1,通常指命令執行所回傳的正確資訊 ,預設輸出到螢幕u。使用符號》或》
標準錯誤(stderr):檔案描述符2,通常指命令執行失敗後,所回傳的資訊,也是預設輸出到螢幕。試用符號2>或2>>
預設情況下》和》分別表示1>或1>>,《和《與0《和0《等價
什麼時候需要重定向:
1)螢幕輸出的資訊很重要,而且我們需要將它存下來的時候。
2)後台執行中的程式,不希望它干擾螢幕正常的輸出結果時。
3)一些系統的例行命令。(例如寫在/etc/crontab中的檔案)的執行結果時,希望它可以存下來。
4)一些執行命令的可能已知錯誤資訊時,想以「2>dev/null"將它丟掉
5)錯誤資訊與正確資訊需要分別輸出時
1、標準輸出重定向
#ls表示列出當前目錄條目,並將結果輸出到螢幕。
#ls 1>file1
以上命令會把命令的標準輸出重新定向到乙個檔案file,而不是顯示到螢幕上,如果不指明檔案識別符號,系統預設的就是1, 因此1可以省略。
即這個命令等同於
#ls >file1
如果file1不存在,則系統會自動建立。如果已經存在,那麼系統首先會把這個檔案清空,然後再將資料寫入該檔案。也就是說》輸出到乙個已存在的檔案,那麼會覆蓋這個檔案。如果不想覆蓋,可以使用》。表示將重定向資料追加到file1檔案的末尾。
2、標準錯誤重定向
#ls -qw 2>errorfile
表示將錯誤資訊不輸出到螢幕,而是寫入errorfile。注意這裡的2不能省略。因為》與1>等同,預設是標準輸出重定向。所以這裡要寫成2>,表示標準錯誤重定向。-qw用來產生錯誤資訊。
3、stderr、stdout分別重定向到不同的檔案
#find /home -name .bashrc > list_right 2>list_error
此時螢幕上不會有任何資訊顯示,因為執行該命令以後,有permission的那幾行錯誤資訊會輸出到list_error檔案中,而正確資訊會輸出到list_right檔案中
4、stderr、stdout寫入同乙個檔案
#./a.out &>outfile
這個命令把./a.out的標準輸出和標準錯誤重定向到outfile。&在這裡表示標準錯誤和標準輸出。下面是另一種寫法:
#./a.out > outfile 2>&1
下面是乙個錯誤的例子:
#./a.out > outfile 2>outfile //之所以錯誤是因為執行該命令時,兩條資料可能交叉寫入造成次序混亂,而另外兩種寫入方法則可避免該問題
5、遮蔽標準輸出或標準錯誤
有時候我們不需要顯示或者儲存正確或錯誤資訊時,可以遮蔽標準輸出或標準錯誤:
./a.out > /dev/null #等同於./a.out 1>dev/null 表示遮蔽標準輸出
./a.out 2>/dev/null #表示遮蔽標準錯誤
./a.out > /dev/null 2>/dev/null #表示同時遮蔽標準輸出和標準錯誤
6、標準輸入重定向
cat > catfile
<
~/.bashrc
建立新檔案catfile並用~/.bashrc中的內容作為catfile檔案的內容
cat > catfile <
在這裡,則是將《右側的字元「eof」作為控制字元,用於終止輸入,而不用鍵入ctrl+d來終止輸入
經常你可能還有這樣的需求,除了將需要將輸出重定向到檔案之外也需要將資訊列印在終端,那麼你可以使用tee
命令來實現:
$ echo
'hello shiyanlou' | tee hello
9、永久重定向你應該可以看出我們前面的重定向操作都只是臨時性的,即只對當前命令有效,那如何做到「永久」有效呢,比如在乙個指令碼中,你需要某一部分的命令的輸出全部進行重定向,難道要讓你在每個命令上面加上臨時重定向的操作嘛,當然不需要,我們可以使用exec
命令實現「永久」重定向。exec
命令的作用是使用指定的命令替換當前的 shell,及使用乙個程序替換當前程序,或者指定新的重定向:
# 先開啟乙個子 shell
$ zsh
# 使用exec替換當前程序的重定向,將標準輸出重定向到乙個檔案
$ exec 1>somefile
# 後面你執行的命令的輸出都將被重定向到檔案中,直到你退出當前子shell,或取消exec的重定向(後面將告訴你怎麼做)
$ ls
$ exit
$ cat somefile
參考:《鳥哥的私房菜》 Linux資料流重定向
開篇 當在執行shell命令時,常見的就是輸出在螢幕上,但是我們有些時候需要儲存輸出結果或者丟棄輸出錯誤,就需要重定向了。什麼是資料流重定向 當我們執行乙個命令 命令不也是程式嘛 可能由檔案或者鍵盤讀入資料,經過處理之後,再將結果輸出到螢幕上。圖中,standard output與standard ...
Linux 資料流重定向
1.三種資料流重定向 1 標準輸入 stdin 為0,使用0 或0 2 標準輸出 stdout 為1,使用1 或1 其中 1可以省略 3 標準錯誤輸出 stderr 為2,使用2 或2 2.標準輸出 stdout 重定向 我們知道linux中,cat命令可以將檔案內容輸出到螢幕。如下所示 我們可以使...
Linux 資料流重定向
一般來說,如果你要執行乙個命令,這個命令可能會由檔案讀入資料,經過處理之後,再將資料輸出到螢幕上。標準輸出與標準錯誤 簡單地說,標準輸出指的是命令執行所回傳的正確的資訊,而標準錯誤輸出可以理解為命令執行失敗後,所回傳的錯誤資訊。這兩個命令預設都是輸出到螢幕上來,所以螢幕當然是混亂的。那能不能通過某些...