Linux資料流重定向

2021-08-19 17:33:12 字數 2810 閱讀 6824

在我們日常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 資料流重定向

一般來說,如果你要執行乙個命令,這個命令可能會由檔案讀入資料,經過處理之後,再將資料輸出到螢幕上。標準輸出與標準錯誤 簡單地說,標準輸出指的是命令執行所回傳的正確的資訊,而標準錯誤輸出可以理解為命令執行失敗後,所回傳的錯誤資訊。這兩個命令預設都是輸出到螢幕上來,所以螢幕當然是混亂的。那能不能通過某些...