RHEL-用戶基礎-重定向

主要概念: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.
相關文章
相關標籤/搜索