主要概念:shell
1.基於終端的程序每每從一個源讀取信息,向一個目的地寫入信息;瀏覽器
2.程序讀取的源被稱爲標準輸入(簡稱爲stdin),一般與終端鍵盤鏈接;bash
3.程序寫入的目的地被稱爲標準輸出(簡稱爲stdout),一般與終端顯示器相連;網絡
4.使用bash Shell時,能夠用>或>>重定向標準輸出,用<重定向標準輸入;編輯器
許多Linux命令從鍵盤讀取輸入,向終端顯示輸出。一個命令的輸出能夠用做另外一個命令的輸入,從而能夠同時使用多個簡單的命令來執行更復雜的任務。ide
三種類型的程序:函數
1.圖形程序性能
圖形程序是爲在X圖形環境中運行設計的。它們但願用戶使用鼠標,而且使用經常使用的圖形組件,如彈出菜單和按鈕做爲用戶輸入。Firefox網絡瀏覽器就是一種圖形程序。ui
2.屏幕程序this
基於屏幕的程序使用文本控制檯。它們利用整個屏幕熟練地處理文本定位和屏幕刷新。它們不須要鼠標,所以適用於終端盒虛擬控制檯。vi和nano文本編輯器以及links網絡瀏覽器都屬於屏幕程序。
3.終端程序
終端程序以流的形式彙集輸入和顯示輸出,不多刷新屏幕,終端程序以其簡明的特色常常被簡單地稱做命令。ls、grep和useradd屬於終端程序。
例如:
1.用戶elvis使用的機器變得很是緩慢,爲了診斷問題,elvis想檢查當前運行的進程,可是因爲機器反應很慢,他如今先蒐集信息,以後再作分析,他把ps aux命令的輸出重定向到文件pusaux.txt文件中,當機器反應快時再回頭檢查這個文件。
[root@host2 tmp]# ps aux > /tmp/sluggish.txt
2.elvis如今不只想要收集進程信息,還要記錄電腦出現反應遲鈍狀況時的時間戳
[root@host2 tmp]# date > psaux.txt | ps aux >> sluggish.txt [root@host2 tmp]# head sluggish.txt Wed Nov 5 19:07:00 CST 2014 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.1 0.1 19352 1536 ? Ss 18:50 0:01 /sbin/init root 2 0.0 0.0 0 0 ? S 18:50 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 18:50 0:00 [migration/0] root 4 0.0 0.0 0 0 ? S 18:50 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S 18:50 0:00 [migration/0] root 6 0.0 0.0 0 0 ? S 18:50 0:00 [watchdog/0] root 7 0.1 0.0 0 0 ? S 18:50 0:01 [events/0] root 8 0.0 0.0 0 0 ? S 18:50 0:00 [cgroup]
3.用戶elvis用基於終端的mail命令從鍵盤上給管理員寫了一封電子郵件。mail命令把收件人當作一個參數,主題行能夠用-s命令行選項指定,而後從鍵盤上鍵入郵件正文,另起一行上單獨寫一個英語的句號,標誌着郵件正文結束。
[root@host2 /]# mail -s "Computer is sluggish" sysadmin@example.com Hey sysadmin: I'm sending a list of processes that were running when the computer was running in a separate email. Thanks! --elvis . EOT
做爲後續回覆信息,用戶elvis能夠將記錄在文件sluggish.txt中的ps命令輸出發送出去,他只需重定向mail命令的標準輸入流,使之從文件中讀取就能夠了。
[root@host2 tmp]# mail -s "ps output" sysadmin@example.com < sluggish.txt
【透過表象看本質:打開文件盒文件描述符】
爲了全面理解進程如何管理標準輸入、標準輸出和文件,咱們必須引入文件描述符(file descriptor)這一律念。要從文件讀取信息或向文件寫入信息,進程必須打開這個文件。Linux/Unix進程經過給每一個當前被他們打開的文件賦整數值來追蹤這些文件,這個整數被稱做文件描述符。
Linux內核提供了一個簡單的方法,用/proc文件系統來檢查當前運行進程打開的文件和文件描述符。每一個進程在/proc下有一個相關的子目錄,以其進程ID命名。進程的子目錄裏有一個叫作fd(file descriptor)的子目錄。在/proc/pid/fd子目錄中,進程打開的每一個文件都有一個符號鏈接。符號鏈接的名稱是打開文件的整數文件描述符,符號鏈接解析到被打開文件自己。
例子:
ftp和gnuplot程序都是複雜的程序,所以這幾個例子僅僅介紹了與本節主題相關的程序功能:若是程序是從命令行界面上驅動的,一般能夠用簡單的文本輸入和重定向自動驅動這個程序。
1.走出sort命令的困惑
用戶使用sort命令對文本文件zoo中的動物進行排序;
[root@host2 tmp]# ls zoo [root@host2 tmp]# cat zoo elephant seal ape giraffe fish [root@host2 tmp]# sort zoo ape elephant fish giraffe seal [root@host2 tmp]# sort < zoo ape elephant fish giraffe seal
sort命令(以最簡單的形式)讀取文件,並寫入按字母順序逐行分類的內容。像cat命令同樣,當沒有提供任何參數時,sort命令將標準輸入做爲它的輸出。
[root@host2 tmp]# sort ls quit man sort exit get me out of this exit get me out of this ls man sort quit
2.用戶想用簡單的方法生成機器CPU活動圖。他對vmstst命令很熟悉,這個命令能夠對設計系統性能許多參數進行抽樣並製成表格,這個命令採用兩個數字參數:
第一個指定了抽樣時間(以秒爲單位);
第二個指定了要採集的樣本數;
他對後三列很感興趣,這三列是CPU在用戶(us)、系統(sy)和空閒(id)狀態上所花的時間百分比。他從機器上採集了60秒的數據,抽樣檢查每秒鐘的數據。
[root@host2 tmp]# vmstat 1 60 > stats.txt [root@host2 tmp]# head stats.txt procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 256156 74520 257560 0 0 38 9 43 73 0 0 99 1 0 0 0 0 256140 74520 257592 0 0 0 0 27 50 0 0 100 0 0 0 0 0 256140 74520 257592 0 0 0 0 29 48 1 0 99 0 0 0 0 0 256140 74520 257592 0 0 0 0 22 40 0 0 100 0 0 2 0 0 256140 74520 257592 0 0 0 0 25 53 0 0 100 0 0 0 0 0 256140 74520 257592 0 0 0 0 25 49 0 1 99 0 0 1 0 0 256140 74528 257592 0 0 0 56 30 55 1 0 99 0 0 1 0 0 256132 74528 257592 0 0 0 88 48 57 0 2 98 0 0
因爲前兩行文本影響了數據圖,用戶在文本編輯器中打卡文件stats.txt,垂手可得地把它們刪除了。
爲了繪製數據圖,她使用了gnuplot命令,這是一個複雜的繪圖軟件包,使用從終端界面讀取的命令來生成數學函數和數值數據圖。瀏覽了gnuplot在線幫助後,她用下列命令繪製數據圖,生成了一個叫作cpu.png的PNG製圖文件。
#gnuplot gnuplot>set term png gnuplot>set output 'cpu.png' gnuplot>plot 'stats.txt' using 0:13 title "user" with lines,'stats.txt' using 0:14 title "system" with lines,'stats.txt' using 0:15 title "idle" with lines gnuplot>quit
退出gnuplot命令後,他返回到bash shell,用ego圖像瀏覽器查看數據圖,如圖所示:
因爲他想常常生成相似的圖,並且不想每次都痛苦地敲gnuplot的繪圖命令,因而他生成了一個能夠用來自動運行gnuplot的腳本,編輯了一個文件cpu_plot.gnuplot,其中包含了全部敲入gnuplot命令:
#cat cpu_plot.gnuplot set term png set output 'cpu.png' plot 'stats.txt' using 0:13 title "user" with lines,'stats.txt' using 0:14 title "system" with lines,'stats.txt' using 0:15 title "idle" with lines
如今,他將腳本重定向爲gnuplot標準輸入來方便地繪製新採集的數據:
#gnuplot < cpu_plot.gnuplot
標準輸入、標準輸出和錯誤輸出的文件描述流:
數據流 描述符 縮寫
標準輸入 0 stdin
標準輸出 1 stdout
標準錯誤 2 stderr
【重定向】
>輸出重定向,覆蓋掉原有內容;稱爲覆蓋輸出
<輸入重定向
>>追加輸出,在原文後追加輸入內容
<<在此處生成文檔(here document)
set -C禁止對已經存在的文件使用覆蓋重定向
強制覆蓋輸出,則使用 >|
set +C關閉上述功能
2>重定向錯誤輸出
2>>追加方式重定向錯誤輸出
&>重定向標準輸出或錯誤輸出至同一個文件(輸出全部)
-----bash中重定向標準輸入、標準輸出和標準錯誤一覽表-----
cmd < file從file重定向標準輸入
cmd > file把標準輸出重定向到file中,若是file存在的話,覆蓋(損壞)它
cmd >> file把標準輸出重定向到file中,若是file存在,附加給它
cmd 2> file把標準錯誤重定向到file,若是file存在,覆蓋(損壞)它
cmd 2>> file把標準錯誤重定向到file,若是file存在,附加給它
cmd > file 2> &1合併標準輸出和標準錯誤,而且重定向到file中(可移植的語法)
cmd >& file合併標準輸出和標註錯誤,而且重定向到file中(方便的語法)
【用/dev/null過濾標準錯誤】
find /var -user elvis 2> /tmp/tmp find /var -user elvis 2> /dev/null
由於elvis的權限有限,var下面的目錄中與用戶elvis有關的子目錄就顯示出來,但更可能是保全部權限拒絕的錯誤信息,所以要篩選錯誤;
第一種方法雖然過濾了錯誤信息,但卻多了個用戶並不想要的tmp文件,所以採用了第二種方法過濾;
在這種狀況下,當用戶想拋棄信息流時,有經驗的Unix用戶一般會把輸出重定向到一個叫作/dev/null的僞設備中。
/dev/null是一個字符設備節點,就像用在約定的設備驅動中的節點同樣。
當用戶寫入/dev/null時,信息只會被內核拋棄,當用戶從/dev/null讀取時,他們會很快讀完文件。注意,RHEL默認配置下,/dev/null是少數幾個普通用戶有寫入權限的文件之一。
ls /varr > /tmp/var1.out 2> /tmp/var2.out
若是正確就輸出到var1.out,若是錯誤就輸出到var2.out
END有時候也用EOF(End of File)
[root@host2 tmp]# cat << END > the first line. > the second line. > END the first line. the second line. [root@host2 tmp]# cat >> /tmp/file.txt << EOF > the first line. > the second line. > EOF [root@host2 tmp]# ls file.txt [root@host2 tmp]# cat file.txt the first line. the second line.