重新導向 (電腦)

进程间通信的一种形式,是一个最常用的功能命令行解释器,包括各种Unix shell,可以将标准流重定向到指定的位置

在電腦領域,重新導向是大多數命令列直譯器所具有的功能,包括各種可以將標準流重新導向用戶規定地點的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客戶端,然後輸入用戶名,Enter,然後再輸入密碼。

標準檔案控制代碼的重新導向

編輯

源自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

外部連結

編輯