1. 程式人生 > >Linux——標準I/O以及管道

Linux——標準I/O以及管道

run 克服 標準 ech 習慣 進程間 nsf lin sof

標準I/O以及管道



目錄

一、什麽是I/O

二、什麽是管道

三、三種I/O設備

四、把I/O輸出錯誤重定向入文件

五、tr

六、從文件中導入STDIN

七、使用管道鏈接命令

八、tee




一、什麽是I/O

I/O(input/output),即輸入/輸出端口

每個設備都會有一個專用的I/O地址,用來處理自己的輸入輸出信息。CPU與外部設備存儲器的連接和數據交換都需要通過接口設備來實現,前者被稱為I/O接口,而後者則被稱為存儲器 接口。存儲器通常在CPU的同步控制下工作,接口電路比較簡單;而I/O設備品種繁多,其相應的接口電路也各不相同,因此,習慣上說到接口只是指I/O接口。


二、什麽是管道

管道是Linux支持的最初UnixIPC形式之一

管道和有名管道是最早的進程間通信機制之一,管道可用於具有親緣關系進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有 管道所具有的功能外,它還允許無親緣關系進程間的通信。

具有以下特點:管道是半雙工的,數據只能向一個方向流動;需要雙方通信時,需要建立起兩個管道;只能用於父子進程或者兄弟進程之間(具有親緣關系的進程);單獨構成一種獨立 的文件系統:管道對於管道兩端的進程而言,就是一個文件,但它不是普通的文件,它不屬於某種文件系統,而是自立門戶,單獨構成一種文件系統,並且只存在與內存中。數據的讀出 和寫入:一個進程向管道中寫的內容被管道另一端的進程讀出。寫入的內容每次都添加在管道緩沖區的末尾,並且每次都是從緩沖區的頭部讀出數據。


三、三種I/O設備

1、標準輸入(STDIN)-0

輸入設備:鍵盤、鼠標、麥克風、攝像頭、掃描儀

2、標準輸出(STDOUT)-1默認輸出到終端窗口

輸出設備:顯示器、打印機、音響、耳機

3、標準錯誤(STDERR)-2默認輸出到終端窗口


四、把I/O輸出錯誤重定向入文件

1、STDOUT和STDERR可以被重定向到文件:

command 操作符號 file

2、支持的操作符號包括:
> 把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把所有輸出重定向到文件

3、> 文件內容會被覆蓋
set -C: 禁止將內容覆蓋已有文件,但可追加
>| file:強制覆蓋
set +C: 允許覆蓋

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

5、2>: 覆蓋重定向錯誤輸出數據流
6、2>>: 追加重定向錯誤輸出數據流
7、 標準輸出和錯誤輸出各自定向至不同位置
COMMAND > /path/to/file.out2> /path/to/error.out
8、合並標準輸出和錯誤輸出為同一個數據流進行重定向
&>覆蓋重定向
&>> 追加重定向
COMMAND > /path/to/file.out2>&1 (順序很重要)
COMMAND >> /path/to/file.out2>&1
9、():合並多個程序的STDOUT
(cal2007;cal2008)> all.txt


五、tr

1、tr轉換和刪除字符
2、tr[OPTION]... SET1 [SET2]
3、選項:
-c–C --complement:取字符集的補集
-d--delete:刪除所有屬於第一字符集的字符
-s--squeeze-repeats:把連續重復的字符以單獨一個字符表示
-t--truncate-set1:將第一個字符集對應字符轉化為第二字符集對應的字符
4、通配符

[:alnum:]:字母和數字

[:alpha:]:字母

[:cntrl:]:控制(非打印)字符

[:digit:]:數字

[:graph:]:圖形字符

[:lower:]:小寫字母

[:print:]:可打印字符

[:punct:]:標點符號

[:space:]:空白字符

[:upper:]:大寫字母

[:xdigit:]:十六進制字符


六、從文件中STDIN

1、使用<來重定向標準輸入
2、某些命令能夠接受從文件中導入的STDIN
tr‘a-z’‘A-Z’</etc/issue
該命令會把/etc/issue中的小寫字符都轉換成寫寫字符
3、 tr–d abc< /etc/fstab刪除fstab文件中的所有abc中任意字符
4、cat > file
mage
wangxiaochun
按ctrl+d離開,可以使用文件來代替鍵盤的輸入

5、cat > filea< fileb


六、使用管道鏈接命令

1、管道(使用符號“|”表示)用來連接命令
命令1 | 命令2 | 命令3 | …
將命令1的STDOUT發送給命令2的STDIN,命令2的STDOUT發送到命令3的STDIN
STDERR默認不能通過管道轉發,可利用2>&1 或|& 實現
最後一個命令會在當前shell進程的子shell進程中執行用來
組合多種工具的功能
ls | tr 'a-z' 'A-Z'

2、less :一頁一頁地查看輸入
ls-l/etc|less

3、mail:通過電子郵件發送輸入
echo"testemail"|mail-s "test"[email protected]

4、lpr:把輸入發送給打印機
echo"testprint"|lpr-Pprinter_name

5、- 符號

示例:
將/home 裏面的文件打包,但打包的數據不是記錄到文件,而是傳送到stdout,經過管道後,將tar -cvf-/home 傳送給後面的tar -xvf-, 後面的這個-則是取前一個命令的stdout,因 此,就不需要使用臨時file了

tar -cvf-/home | tar -xvf-


七、重定向到多個目標(tee)

1、命令1 | tee[-a ] 文件名| 命令2
把命令1的STDOUT保存在文件中,做為命令2的輸入
-a 追加

2、使用:
保存不同階段的輸出
復雜管道的故障排除
同時查看和記錄輸出

Linux——標準I/O以及管道