標準I O和管道小記

2021-10-05 01:24:16 字數 3828 閱讀 5765

標準輸入和輸出

程式:指令+資料

程式中的資料通常有多種**;

程式:也有io

可用於輸入的裝置:檔案

鍵盤裝置、檔案系統上的常規檔案、網絡卡等

可用於輸出的裝置:檔案

顯示器、檔案系統上常規檔案、網絡卡等

程式的資料流有三種:

輸入的資料流:

輸出的資料流:--> 標準輸出(stdout),顯示器

錯誤輸出流:--> 錯誤輸出(stderr),顯示器

fd:file descriptor,檔案描述符

標準輸入:0

標準輸出:1

錯誤輸出:2

讀入資料:input

輸出資料:output

開啟的檔案都有乙個fd: file descriptor (檔案描述符) 檔案描述符所在位置:/proc

每乙個數字都對應乙個應用程式的程序。

可以看到3對應的就是使用命令檢視的linux.txt的命令程序,0,1,2對應的就是下面要說的linux提供的三種i/o裝置。

linux給程式提供三種 i/o 裝置

標準輸入(stdin)-0 預設接受來自鍵盤的輸入

標準輸出(stdout)-1 預設輸出到終端視窗

標準錯誤(stderr)-2 預設輸出到終端視窗

i/o重定向
i/o重定向:改變i/o預設位置

把輸出和錯誤重新定向到檔案:

stdout和stderr可以被重定向到檔案

命令 操作符號 檔名

支援的操作符號包括:

> 把stdout重定向到檔案

2> 把stderr重定向到檔案

&> 把所有輸出重定向到檔案

> 檔案內容會被覆蓋

set -c

禁止將內容覆蓋已有檔案,但可追加

>| file 強制覆蓋

set +c

關閉上述特性允許覆蓋

>> 原有內容基礎上,追加內容

<< 此處建立文件

2> 覆蓋重定向錯誤輸出資料流

2>> 追加重定向錯誤輸出資料流

標準輸出和錯誤輸出各自定向至不同位置

command > /path/to/file.out 2> /path/to/error.out

合併標準輸出和錯誤輸出為同乙個資料流進行重定向

&> 覆蓋重定向

&>> 追加重定向

command > /path/to/file.out 2>&1 (順序很重要)

command >> /path/to/file.out 2>&1

> all.log 2>&1的邏輯:標準輸出到all.log,標準錯誤輸出到標準輸出,等同於 &>

2>&1 > all.log的邏輯:標準錯誤輸出到標準輸出(螢幕顯示),標準輸出再重定向到all.log

1>&2 2> all.log邏輯:標準輸出螢幕列印,標準錯誤重定向到all.log

2> all.log 1>&2邏輯:標準錯誤重定向到all.log,標準輸出輸出到標準錯誤,等同於 &>

():合併多個程式的stdout

( cal 2007 ; cal 2008 ) > all.txt

特殊裝置:/dev/null

從檔案中匯入(標準輸入)
使用 < 來重定向標準輸入

某些命令能夠接受從檔案中匯入的stdin

tr 『a-z』 『a-z』< /etc/issue

該命令會把/etc/issue中的小寫字元都轉換成大寫字元

tr -d abc < /etc/fstab

刪除fstab檔案中的所有abc中任意字元

cat > file

mage

wangxiaochun

按ctrl+d離開,可以使用檔案來代替鍵盤的輸入

cat < file1 > file2

cat < file1 >> file1

把多行傳送給stdin,here document:<<

cat << eof

cat > /path/to/somefile << eof

使用「《終止詞」命令從鍵盤把多行重導向給stdin

直到 終止詞 位置的所有文字都傳送給stdin

有時被稱為就地文字(here documents)

mail -s "please call" [email protected]

>

> please give me a call when you get in. we may need

> to do some maintenance on server1.

>

> details when you're on-site

> zhang

> end

管道
管道(使用符號「|」表示)用來連線命令,將前乙個命令的輸出,當做下乙個命令的輸入

命令1 | 命令2 | 命令3 | …

將命令1的stdout傳送給命令2的stdin,命令2的stdout傳送到命令3的

stdin

stderr預設不能通過管道**,可利用2>&1 或 |& 實現

最後乙個命令會在當前shell程序的子shell程序中執行

組合多種工具的功能

ls | tr 『a-z』 『a-z』

錯誤資訊無法當作標準輸入使用管道符往下傳,使用重定向解決:

[00:08:39 op@lb-test3 ~]$hos 2>&1 | tr 'a-z' 'a-z'

-bash: hos: command not found

[00:18:35 op@lb-test3 ~]$hos |& tr 'a-z' 'a-z'

-bash: hos: command not found

less :一頁一頁地檢視輸入

ls -l /etc | less

mail: 通過電子郵件傳送輸入

echo "test email" | mail -s "test" [email protected]

bc:算術運算

echo "2^3" |bc

tee:從標準輸入讀資料,會寫到標準輸出和檔案

command | tee /path/to/somefile

管道中的 『-』 符號
示例: 

將 /home 裡面的檔案打包,但打包的資料不是記錄到檔案,而是傳送到 stdout,

經過管道後,將 tar -cvf - /home 傳送給後面的 tar -xvf - , 後面的這個 - 則是取

前乙個命令的 stdout, 因此,就不需要使用臨時file了

tar -cvf - /home | tar -xvf -

重定向到多個目標
重定向標準輸出後,只能在檔案中看到內容,在螢幕上不顯示,如果想看到螢幕顯示,可以採用重定向到多個目標

命令1 | tee [-a ] 檔名 | 命令2

把命令1的stdout儲存在檔案中,做為命令2的輸入,預設是會覆蓋原檔案的內容,使用引數『-a』追加到檔案

-a 追加

使用: 儲存不同階段的輸出

複雜管道的故障排除

同時檢視和記錄輸出

標準I O和管道

標準輸入 0 標準輸出 1 錯誤輸出 2標準輸入 stdin 0 預設接受來自鍵盤的輸入 標準輸出 stdout 1 預設輸出到終端視窗 標準錯誤 stderr 2 預設輸出到終端視窗改變檔案儲存的預設位置 格式 命令 操作符號 檔名 支援的操作符號包括 把標準輸出重定向到檔案 把輸出內容重定向追加...

標準I O和管道

重定向 redirect 標準輸入和輸出程式 指令 資料 讀入資料 input 輸出資料 output 開啟的檔案都有乙個fd file descriptor 檔案描述符 dev std proc self fd 終端linux給程式提供三種i o管道標準輸入 stdin 0 預設接受來自鍵盤的輸入...

標準IO和管道

1 將 etc issue檔案中的內容轉換為大寫後儲存至 tmp issue.out檔案中 1.cat etc issue tr a z a z tmp issue.out 2.tr a z a z tmp issue.out 2 將當前系統登入使用者的資訊轉換為大寫後儲存至 tmp who.out...