重定向 (計算機)

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

在計算機領域,重定向是大多數命令行解釋器所具有的功能,包括各種可以將標準流重定向用戶規定地點的Unix shells。類Unix操作系統的程序可以透過dup2(2)系統調用完成重定向,或者透過缺少一些靈活性但是更高一級層次的freopen(3)和popen(3)來完成。

重定向標準輸入輸出[編輯]

重定向一般透過在命令間插入特定的符號來實現。特別的,這些符號的語法如下所示:

command1 >file1

上面這個命令執行command1然後將輸出的內容存入file1.注意任何file1內的已經存在的內容將被新內容替代。如果要將新內容添加在文件末尾,請使用>>操作符。

command1 <file1

執行command1,使用file1作為用來替代鍵盤的輸入源。

command1  <infile > outfile

同時替換輸入和輸出,執行command1,從文件infile讀取內容,然後將輸出寫入到outfile中。

管道[編輯]

多個程序可以一起運行,一個程序可以直接將另外一個程序的輸出作為其輸入,並且不需要藉助中間文件:

command1 | command2

執行command1,將其輸出作為command2的輸入。這種方式被稱為管道,因為"|"字符被稱為"管道"。這種方式的結果和使用2個重定向及一個臨時文件的方式相等價:

command1 > tempfile
command2 < tempfile
rm tempfile

但是使用管道的時候兩個命令是同時執行的,較為省時。

一個使用命令管道的很好例子是使用echo和另外一個命令達到在一個非交互式shell中達到一定的交互效果:

echo -e "user\npass" | ftp localhost

這個例子運行ftp客戶端,然後輸入用戶名,回車,然後再輸入密碼。

標準文件句柄的重定向[編輯]

源自Bourne shell的許多Unix shell,可以將一個數字(文件描述符)放在重定向符號前,這樣可以影響用於重定向的數據流。Unix的標準輸入輸出流是:

Handle Name Description
0 stdin 標準輸入
1 stdout 標準輸出
2 stderr 標準錯誤輸出

例如:

command1 2> file1

執行command1,然後將標準錯誤輸出重定向到文件file1

一些源自csh的shells,將&符號放在重定向符號後,達到同樣的效果。這樣做的原因是為了將標準輸出與文件名為'1'的文件區分開來。例如對於'cat file 2>1'和'cat file 2>&1',前者會將錯誤輸出重定向至叫做'1'的文件,後者則將其重定向至標準輸出。

另外一個很有用的功能是將一個標準文件句柄重定向到另一個。最流行的一種用法是將標準錯誤輸出融合到標準輸出中去,這樣錯誤信息可以和其他普通的輸出信息一起處理。例如:

find / -name .profile > results 2>&1

上面這個命令會找到所有名字為.profile的文件。如果沒有重定向,它會輸出結果到標準輸出,錯誤(例如在遍歷過程中缺少訪問某些受保護目錄的權限)到標準錯誤輸出。如果標準輸出被重定向到一個文件,那麼錯誤信息就會出現在控制台上。通過使用重定向2>&1,輸出的結果和錯誤信息都被寫入了文件results.

可以將2>&1放置在">"前,但是這樣並不能達到我們想要的效果。因為當解釋器讀到2>&1, 它並不知道標準輸出已經被重定向到哪裡,所以標準錯誤輸出並沒有和標準輸出融合。

如果融合過的輸出通過管道作為另外一個程序的輸入,那麼這個融合2>&1必須在管道符號之前:

find / -name .profile 2>&1 | less

一個命令

command > file 2>&1

的簡化版本 (不使用於bourne shell)

command &>file

或者

command >&file

連鎖管道[編輯]

重定向和管道符可以聯合使用,這樣可以組合出更加複雜的命令, 例如:

ls | grep '\.sh' | sort > shlist

上面這個命令將當前目錄的內容列出來,將其作為grep命令的輸入內容,grep將過濾掉沒有以".sh"結尾的內容,然後將內容輸出給sort英語Sort_(Unix)命令作為輸入參數,sort將輸入內容按照字符的順序排序以後,將最終的輸入內容寫入shlist文件。在UnixLinux操作系統中,這個樣的組合命令非常的常見。

重定向到多個輸出[編輯]

命令tee可以將一個命令的輸出重定向到幾個目標:

ls -lrt | tee xyz

上面這個例子將ls的輸出重新定向到標準輸出和文件xyz。

參見[編輯]

  • Here-document, a way of specifying text for input in command line shells

外部連結[編輯]