8.7標準輸出和標準出錯兩者重定向1. 使用>和2>可以將一次操作的正確、錯誤輸入,被單獨地送到不同的地方:
find / —name passwd 2 > errs “1”(可省略)> results
代表錯誤資訊 代表正確資訊
2. 每一個輸入輸出方向都能被重定向到不同的檔案或儲存到檔案find / —name passwd > alloutput 2> &
(or) find / —name passwd & > alloutput
代表“1”和“2”即所有輸出
3. 舉例說明⑴ $ find /etc -name passwd 2 > errs > resrlts
⑵ $ cat errs
⑶ $ cat resuts
⑷ $ find /etc -name passwd > alloutput
⑸ $ cat alloutput
8.8 輸入重定向輸入重定向大多使用在檔案流的引入中,由於大多數命令都以引數的形式在命令列上指定輸入檔案的檔名,所以輸入重定向並不經常使用。儘管如此,當要使用一個不接受檔名作為輸入引數的命令,而需要的輸入內容有存在一個檔案裡時,就能用輸入重定向解決問題。
1.使用 < 來重定向輸入源。格式:command < file2.一些命令只對標準輸入起作用:⑴ tr(translate character 跳脫字元),不允許檔名作為引數,它需要它的輸入從某處被重定向。
⑵ tr ‘A-z’‘a—z’ < .bash_profile
這個命令將 .bash_profile 裡的大寫字元轉譯成小寫字元。
一些Linux命令,像cat,通常將一個檔案作為它們的輸入源,像此類的命令通常允許將一個檔案或標準輸入兩者作為輸入源。
下面兩個命令將產生同樣的輸出:
$ cat filename .txt
$ cat <filename .txt
少數的命令,像字元轉譯tr,不允許檔名作為引數並且必須有他們的輸入重定向。
3. 舉例說明$ cat textfile.txt
TEXT TYPE IN ALL CAPITALS IS OFIEN
$ tr ‘A—z’‘a—z’< textfile.txt
text trpe in all capitals is often
8.9使用管道(|)連線程式1.管道使一個命令的輸出成為另一個命令的輸入。2.linux 的一個有力的特色是可以建立管道。第1個區域 以“:”為分界線。
UNIX的兩條最基本的理論是:1.使小程式更好地做一件事。2.要求每一個程式的輸出能夠成為另一個程式的輸入。強大的命令通道可以完成你期望的結果,大多的命令程式操作一個檔案也可以在標準輸出上輸出或在標準輸入上輸入,一些命令像tr 被故意地只能與一個管道發生作用。
一些命令標準輸出的內容能被用在管道左面。
一些命令從標準輸入讀到的內容能被用在管道右面。
例:
$ pwd
$ ls -c | tr ‘a—z’‘A—z’
3.允許多重管道8.10 tee命令1. 讓你連環一個管道:重定向輸出到一個檔案,此時,這個檔案仍被管道到另一個程式。lspci —r |tee lspci.out | less
從lspci的輸出是寫到檔案lspci.out,但lspci.out也被管道到less。
2. tee的用法:tee是用來儲存從一個連續管道輸出的不同內容。
例:
$ command /tee stage /.out /sort / tee stage2.out /uniq -c /tee stage3.out /sort -r /tee stage4.out less
8.11 重定向、管道的常用範例1. 分屏顯示當前目錄下的檔案。ls -l | more
2. 複製filea到filebcat <filea>fileb
3. 將數個小檔案合併成一個檔案。cat file. * > file
8.12 標準輸入輸出和管道試驗估計時間: 30分鐘
目標: 熟悉Red Hat Linux中的標準輸入輸出和管道
試驗的起點: 標準的Red Hat Linux安裝
1.標準輸入和輸出任務:
⑴ 使用你熟悉的編輯器建立兩個檔案:
packages1.txt 應該包含以下八行:
Amanda
galleon
metacity
mozilla
postgresql
procinfo
rpmfind
squid
packages2.txt應該包含以下6行
anaconda
openssh
gnome-core
samba
sendmail
xscreensaver
⑵ cat工具是最簡單的linux過濾器,它會預設把跟在後面的引數當作檔名,並把這個檔案作為輸入,如果沒有檔名則把標準的輸入作為自己的輸入,然後將它們傳送到標準的輸出上去。現在我們來實驗一下:
$cat packages1.txt
⑶ 如果【cat】後沒有引數,則它會等待標準的輸入,所以當你輸入【cat】命令後,再回車,然後什麼也沒有顯示。輸入【cat】後,【cat】命令會監視標準輸入,等待輸入的到達。如果這個時候輸入一些文字,再按回車,【cat】就會把輸入的內容當作自己的輸入,然後輸出到標準的輸出——顯示器上,結束【cat】的命令為按下【ctrl-d】,這是結束輸入的標誌。
$ cat
輸入一些文字,然後按回車。
^d (就是按【ctrl-d】)
⑷ 大多數的文字處理命令是執行過濾操作,他們可以讀標準輸入,對輸入做一些動作,然後把結果傳送到標準輸出去。這些命令就像cat一樣,只是對輸入的處理不太一樣。
tr命令,也是過濾器命令,如果給tr後加兩個字串作為引數,它會讀取標準輸入,然後把輸入中包含著前一個字串的字元變成第二個字串,然後輸出到標準輸出去。
把剛才的命令換成tr,tr將把字串中有的字元變成大寫的。
$ tr 'aeiou' 'AEIOU'
輸入一些文字,然後按回車。
^d
⑸定義shell不要把命令的輸出發到標準輸出上,而是重定向到一個檔案中,我們使用 > 來重定向
重複cat的例子重定向標準的輸出到packages1.catfile,這樣把輸出到螢幕的東西輸出到了檔案中,效果就和重新copy了一份檔案是一樣的,cat這個輸出檔案,然後用diff和ls確認原檔案與package1.catfile內容一樣。
$ cat packages1.txt > packages1.catfile
$ cat packages1.catfile
$ diff packages1.txt packages1.catfile
$ ls –l packages1*
⑹ 使用>>來重定向會把輸出附加到已存在的檔案的末尾。
把packages2.txt檔案中的內容附加到packages1.catfile之後,然後檢驗結果。
$ cat packages2.txt >> packages1.catfile
$ cat packages1.catfile
⑺ 如果輸出重定向時cat沒有直接跟檔名的引數,那麼cat就會等待標準的輸入,直到按下ctrl-d作為結束,然後把所有輸入的東西重定向到這個檔案中去。這樣可以很容易地建立一個文字檔案,
$ cat > typedin.txt
This time, when text is typed at the keyboard,
It is not echoed back to the screen.
Instead, it is redirected to the file typedin.txt.
^d
$ ls –l typedin.txt
$ cat typedin.txt
⑻ 使用tr取代cat,重複剛才的命令
$ tr 'aeiou' 'AEIOU' > trfile.txt
This time, when text is typed at the keyboard,
It is not echoed back to the screen.
Instead, it is redirected to the file typedin.txt.
^d
$ ls –l trfile.txt
$ cat trfile.txt
⑼ 使用set –o命令,確認顯示出目前bash的noclobber選項是關閉狀態,確認當輸出重定時向你可以重寫檔案
$ set –o
$ ls –l /tmp > trifle.txt
$ ls –l trfile.txt
$ cat trifle.txt
⑽ 使用set命令更改noclobber選項,如下操作:
$ set –o noclobber
$ echo “new contents” > trfile.txt
bash: trfile.txt:cannot overwrite existing file
⑾ cat可以接受一個檔名或者是一個輸入重定向的檔案,測試以下兩個命令:
$ cat packages1.txt
$ cat < packages1.txt
⑿ 但是tr不能接受檔名作為引數,它只希望輸入是標準輸入。
$ tr 'aeiou' 'AEIOU' < packages1.txt
⒀ 下面的例子中標準輸入和輸出都被重定向,輸入還是packages1.txt檔案,這回改為輸出到檔案packages1.trfile.txt中去了。
$ tr 'aeiou' 'AEIOU' < packages1.txt >packages1.trfile.txt
$ ls –l packages1.txt packages1.trfile.txt
$ cat packages1.trfile.txt
2.管道⑴ 把一個命令的標準輸出直接傳輸給另一個命令作為它的標準輸入,這樣特殊的機制叫做管道。
$ ls –l > /tmp/ls.txt
$ lpr /tmp/ls.txt
$ rm /tmp/ls.txt
使用管道,這些命令可以僅僅用以下短短的一條命令,將ls –l的輸出直接傳送給lpr作為輸入,lpr也不需要別的引數。
$ ls –l | lpr
⑵ 管道經常的用法是一個命令產生了很多頁的輸出,可以把這些輸出直接給less,管道左邊是你的命令,右邊是less,less不需要引數。(空格鍵是翻頁,q鍵是退出less)
$ ls –l /usr/bin | less
3.練習答案在下面,可以使用man page來幫助你解決問題
⑴ 複製一份cal命令的man page,放在你的主目錄下,取名叫cal.man。
⑵ 只在一行上輸入什麼樣的命令,可以使你從鍵盤上輸入的文字輸出到印表機上
⑶ 怎樣把/usr/bin下以c或d開頭的檔案列表傳送到印表機上?
4.練習-答案⑴ man cal > cal.man
⑵ lpr
Lpr打印出以後面的引數命名的檔案中的內容,如果沒有引數,lpr就會從標準輸入中讀取,準的輸入是鍵盤,直到你按下【ctrl-d】表示鍵盤輸入結束。
⑶ ls –l /usr/bin/[cd]* | lpr