一篇對(duì)大家學(xué)習(xí),理解linux很有用的文章
由于大多數(shù)命令都以參數(shù)的形式在命令行上指定輸入文件的文件名,所以輸入重定向并不經(jīng)常使用。盡管如此,當(dāng)要使用一個(gè)不接受文件名作為輸入?yún)?shù)的命令,而需要的輸入內(nèi)容又存在一個(gè)文件里時(shí),就能用輸入重定向解決問題。
1. 輸出重定向
輸出重定向是指把命令(或可執(zhí)行程序)的標(biāo)準(zhǔn)輸出或標(biāo)準(zhǔn)錯(cuò)誤輸出重新定向到指定文件中。這樣,該命令的輸出就不顯示在屏幕上,而是寫入到指定文件中。
輸出重定向比輸入重定向更常用,很多情況下都可以使用這種功能。例如,如果某個(gè)命令的輸出很多,在屏幕上不能完全顯示,那么將輸出重定向到一個(gè)文件中,然后再用文本編輯器打開這個(gè)文件,就可以查看輸出信息;如果想保存一個(gè)命令的輸出,也可以使用這種方法。還有,輸出重定向可以用于把一個(gè)命令的輸出當(dāng)作另一個(gè)命令的輸入(還有一種更簡(jiǎn)單的方法,就是使用管道,將在下面介紹)。
輸出重定向的一般形式為:命令>文件名。例如:
$ ls > directory.out
$ cat directory.out
ch1.doc ch2.doc ch3.doc chimp config mail/ test/
$
將ls命令的輸出保存為一個(gè)名為directory.out的文件。
注:如果>符號(hào)后邊的文件已存在,那么這個(gè)文件將被重寫。
為避免輸出重定向中指定文件只能存放當(dāng)前命令的輸出重定向的內(nèi)容,shell提供了輸出重定向的一種追加手段。輸出追加重定向與輸出重定向的功能非常相似,區(qū)別僅在于輸出追加重定向的功能是把命令(或可執(zhí)行程序)的輸出結(jié)果追加到指定文件的最后,而該文件原有內(nèi)容不被破壞。
如果要將一條命令的輸出結(jié)果追加到指定文件的后面,可以使用追加重定向操作符>>。形式為:命令>>文件名。例如:
$ ls *.doc>>directory.out
$ cat directory.out
ch1.doc ch2.doc ch3.doc chimp config mail/ test/
ch1.doc ch2.doc ch3.doc
$
和程序的標(biāo)準(zhǔn)輸出重定向一樣,程序的錯(cuò)誤輸出也可以重新定向。使用符號(hào)2>(或追加符號(hào)2>>)表示對(duì)錯(cuò)誤輸出設(shè)備重定向。例如下面的命令:
$ ls /usr/tmp 2> err.file
可在屏幕上看到程序的正常輸出結(jié)果,但又將程序的任何錯(cuò)誤信息送到文件err.file中,以備將來檢查用。
還可以使用另一個(gè)輸出重定向操作符(>)將標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出同時(shí)送到同一文件中。例如:
$ ls /usr/tmp > output.file
利用重定向?qū)⒚罱M合在一起,可實(shí)現(xiàn)系統(tǒng)單個(gè)命令不能提供的新功能。例如使用下面的命令序列:
$ ls /usr/bin > /tmp/dir
$ wc –w /tmp/dir
459
統(tǒng)計(jì)了/usr/bin目錄下的文件個(gè)數(shù)。
管 道
將一個(gè)程序或命令的輸出作為另一個(gè)程序或命令的輸入,有兩種方法,一種是通過一個(gè)臨時(shí)文件將兩個(gè)命令或程序結(jié)合在一起,例如上個(gè)例子中的/tmp/dir文件將ls和wc命令聯(lián)在一起;另一種是Linux所提供的管道功能。這種方法比前一種方法更好。
管道可以把一系列命令連接起來,這意味著第一個(gè)命令的輸出會(huì)作為第二個(gè)命令的輸入通過管道傳給第二個(gè)命令,第二個(gè)命令的輸出又會(huì)作為第三個(gè)命令的輸入,以此類推。顯示在屏幕上的是管道行中最后一個(gè)命令的輸出(如果命令行中未使用輸出重定向)。
通過使用管道符“|”來建立一個(gè)管道行。用管道重寫上面的例子:
$ ls /usr/bin|wc -w
1789
再如:
$ cat sample.txt|grep High|wc -l
管道將cat命令(列出一個(gè)文件的內(nèi)容)的輸出送給grep命令。grep命令在輸入里查找單詞High,grep命令的輸出則是所有包含單詞High的行,這個(gè)輸出又被送給wc命令,wc命令統(tǒng)計(jì)出輸入中的行數(shù)。假設(shè)sample.txt文件的內(nèi)容如下:
Things to do today:
Low:Go grocery shopping
High:Return movie
High:Clear level 3 in Alien vs. Predator
Medium:Pick up clothes from dry cleaner
那么該管道行的結(jié)果是2。
命令替換
命令替換和重定向有些相似,但區(qū)別在于命令替換是將一個(gè)命令的輸出作為另外一個(gè)命令的參數(shù)。常用命令格式為:
command1 `command2`
其中,command2的輸出將作為command1的參數(shù)。需要注意的是這里的`符號(hào),被它括起來的內(nèi)容將作為命令執(zhí)行,執(zhí)行后的結(jié)果作為command1的參數(shù)。例如:
$ cd `pwd`
該命令將pwd命令列出的目錄作為cd命令的參數(shù),結(jié)果仍然是停留在當(dāng)前目錄下。
第二十二課 在Bash中的操作 2000年/5月/29日
命令和文件名擴(kuò)展特性
Bash命令行具有命令和文件名擴(kuò)展特性。當(dāng)輸入一個(gè)還沒完成的命令或文件名時(shí),只需鍵入Tab鍵就能激活命令和文件名擴(kuò)展特性,從而完成該命令的剩余輸入。如果有多個(gè)命令或文件的前綴相同,Bash將響鈴并等待用戶輸入足夠的字符,以便選擇唯一的命令或文件名,如果找到,系統(tǒng)將自動(dòng)補(bǔ)齊搜索到的命令或文件名,用戶按回車鍵后,系統(tǒng)將執(zhí)行這條指令。例如:
$ cat pre
$ cat preface
Bash也能列出當(dāng)前目錄下部分匹配的文件名來完成文件名擴(kuò)展。如果鍵入Esc,然后鍵入?,shell將列出所有與輸入的字符串相匹配的文件名。例如下例,在沒有完成的輸入后鍵入Esc ?,shell將列出所有與輸入的字符串相匹配的字符串,然后shell回顯命令行,根據(jù)列出的文件名,可以鍵入要輸入的文件名或按下Tab鍵來完成文件名擴(kuò)展。例如:
$ ls
document docudrama
$ cat doc
document
docudrama
$ cat docudrama
[例】下面是一個(gè)目錄包含的文件列表:
Firebird2.7.tgz Firebird.README Firebird2.60.tgz
FireBird Firebird2.60.tgz.README
現(xiàn)在要?jiǎng)h除Firebird2.60.tgz.README文件,鍵入:
$ rm –f Fi
系統(tǒng)會(huì)發(fā)出警報(bào)聲,并且自動(dòng)將命令行補(bǔ)全為:
$ rm –f Fire
并等待用戶進(jìn)一步輸入文件名的后面部分?,F(xiàn)在再鍵入:
b
評(píng)論