linux中的重定向

當我們在shell中執行命令的時候,每個進程都和三個打開的文件相聯繫,並使用文件描述符來引用這些文件。由於文件描述符不容易記憶,shell同時也給出了相應的文件名。

下面就是這些文件描述符及它們通常所對應的文件名:


文件描述符
輸入文件—標準輸入0:它是命令的輸入,缺省是鍵盤,也可以是文件或其他命令的輸出。
輸出文件—標準輸出1:它是命令的輸出,缺省是屏幕,也可以是文件。
錯誤輸出文件—標準錯誤2:這是命令錯誤的輸出,缺省是屏幕,同樣也可以是文件。


文件重定向

在執行命令時,可以指定命令的標準輸入、輸出和錯誤,要實現這一點就需要使用文件重定向。下表列出了最常用的重定向組合,並給出了相應的文件描述符。
在對標準錯誤進行重定向時,必須要使用文件描述符,但是對於標準輸入和輸出來說,這不是必需的。爲了完整起見,下表列出了兩種方法。

command > filename 把把標準輸出重定向到一個新文件中
command >> filename 把把標準輸出重定向到一個文件中(追加)
command 1 > fielname 把把標準輸出重定向到一個文件中
command > filename 2>&1 把把標準輸出和標準錯誤一起重定向到一個文件中
command 2 > filename 把把標準錯誤重定向到一個文件中
command 2 >> filename 把把標準輸出重定向到一個文件中(追加)
command >> filename 2>&1 把把標準輸出和標準錯誤一起重定向到一個文件中(追加)
command < filename > filename2把command命令以filename文件作爲標準輸入,以filename2文件作爲標準輸出
command < filename 把command命令以filename文件作爲標準輸入
command << delimiter 把從標準輸入中讀入,直至遇到delimiter分界符
command <&m 把把文件描述符m作爲標準輸入
command >&m 把把標準輸出重定向到文件描述符m中
command <&- 把關閉標準輸入

注:重定向爲標準輸入時,如果程序中有一個死循環一直fgets讀取輸入,那麼fgets會一直重複讀取到文件中最後一行的數據,而不是空字符。


重定向標準輸出

讓我們來看一個標準輸出的例子。在下面的命令中,把/etc/passwd文件中的用戶ID域按照用戶命排列。該命令的輸出重定向到sort.out文件中。要提醒注意的是,在使用sort命令的時候(或其他含有相似輸入文件參數的命令),重定向符號一定要離開sort命令兩個空格,否則該命令會把它當作輸入文件。
$ cat passwd | awk -F: '{print $1}' | sort  1>sort.out
可以看出,我們也可以使用如下的表達方式,結果和上面一樣:
$ cat passwd | awk -F: '{print $1}' | sort  >sort.out
可以把很多命令的輸出追加到同一文件中。

如果希望把標準輸出重定向到文件中,可以用>filename。在下面的例子中,ls命令的所有輸出都被重定向到ls.out文件中:
$ ls >ls.out

如果想創建一個長度爲0的空文件,可以用>filename:
$ >myfile


重定向標準輸入

可以指定命令的標準輸入。在awk一章就會遇到這樣的情況。下面給出一個這樣的例子:
$ sort < name.txt
在上面的命令中, sort命令的輸入是採用重定向的方式給出的,不過也可以直接把相應的
文件作爲該命令的參數:
$ sort name.txt
在上面的例子中,還可以更進一步地通過重定向爲sort命令指定一個輸出文件name.out。
這樣屏幕上將不會出現任何信息(除了錯誤信息以外):
$ sort <name.txt >name.out
在發送郵件時,可以用重定向的方法發送一個文件中的內容。在下面的例子中,用戶
louise將收到一個郵件,其中含有文件contents.txt中的內容:
$ mail louise < contents.txt

重定向操作符command << delimiter是一種非常有用的命令,通常都被稱爲“此處”文擋。
shell將分界符delimiter之後直至下一個同樣的分界符之前的所有內容都作爲輸入,遇到下一個分界符,shell就知道輸入結束了。這一命令對於自動或遠程的例程非常有用。可以任意定義分界符delimiter,最常見的是EOF,而我最喜歡用MAYDAY,這完全取決於個人的喜好。還可以在<<後面輸入變量。
下面給出一個例子,我們創建了一個名爲myfile的文件,並在其中使用了TERM和LOGNAME變量。

$cat >> myfile <<MAYDAY

> Hello there I am using a $TERIM terminal

> and my user name is $LOGNAME

> bye...

> MAYDAY

 

$ cat myfile

Hello there I am using a vt100 terminal

and my user name is dave

bye...


重定向標準錯誤

爲了重定向標準錯誤,可以指定文件描述符2。
grep命令沒有找到該文件,缺省地向終端輸出了一個錯誤信息。現在讓我們把錯誤重定向到文件/dev/null中(實際就上是系統的垃圾箱):
$ grep "trident" missiles 2>/dev/null
這樣所有的錯誤輸出都輸送到了/dev/null,不再出現在屏幕上。


合併標準輸出和標準錯誤

在合併標準輸出和標準錯誤的時候,切記shell是從左至右分析相應的命令的。下面給出一個例子:
$ cleanup >cleanup.out 2>&1
在上面的例子中,我們將cleanup 腳本的輸出重定向到>cleanup.out文件中,而且其錯誤也被重定向到相同的文件中。
$ grep "standard"* > grep.out 2>&1
在上面的例子中,grep命令的標準輸出和標準錯誤都被重定向到grep.out文件中。你在使出前面提到的“此處”文擋時,有可能需要把所有的輸出都保存到一個文件中,這樣萬一出現了錯誤,就能夠被記錄下來。通過使用2 > & 1就可以做到這一點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章