在Unix和類Unix系統中,如同某些程式語言介面一樣,標準串流是當一個電腦程式執行時,在它和它的環境間(典型為終端),事先連接的輸入和輸出頻道。這三個I/O連結稱作「標準輸入」、「標準輸出」和「標準錯誤輸出」。
在講解標準輸入輸出與重導向前,先來簡單了解檔案描述子(File descriptor, FD)
檔案描述子是一個非負整數的索引,指向核心為每一個行程所維護的該行程打開檔案的記錄表。當程式打開一個現有檔案或者建立一個新檔案時,核心向行程傳回一個檔案描述子。
檔案描述子這一概念只適用於(類)UNIX作業系統。
執行命令前可使用shell的特殊符號對輸入/輸出進行重新導向,假如我想將目前資料夾中所有檔案的名稱(不含子資料夾)都存在一個檔案中我就可以用$ ls > file
來達成
其他重新導向的語法如下
$ command > file # 將檔案內容覆蓋為命令的標準輸出
$ command >> file # 將命令的標準輸出附加至檔案結尾
$ command < file # 以file的內容做為命令輸入
$ command 2>&1 # 將錯誤訊息導向到標準輸出(&n指檔案描述子n)
$ command &> file # 等價於上一個命令
$ command <<< "stdtxt" # 將字串作為標準輸入(bash 2.05b新增)
順便一提,如果看到在>跟<的中旁邊有不帶空格的|時,代表不管檔案是否已經存在都強制覆蓋檔案
$ command >| force-write-file
在類Unix作業系統中,管線指令(Pipe command)是一系列將標準輸入輸出連結起來的行程,其中每一個行程的輸出被直接作為下一個行程的輸入,常用於過濾輸出。而Windows在powershell也引用了類似的設計
管線指令使用 | (pipe) 使得多個程式可以一起執行,一個程式可以直接將另外一個程式的輸出作為其輸入,並且不需要藉助中間檔案。
一個很好的例子是在非互動的shell中可以使用echo與管線指令以達到一定的互動效果
$ echo "print('amogus')" | python3
amogus
管道(wiki)
檔案描述子(wiki)
標準串流
Bash Reference Manual