資料流重導向(I/O Redirection)
Shell可以重導向(Redirect)標準輸入、標準輸出及標準錯誤到(to)一個檔案,或從(from)一個檔案到Shell也可以。也就是說,任何一個要讀取標準輸入的指令可以使用<
運算子讓一個檔案作為輸入:
⤍ any_command < input_file
同樣的,任何指令的標準輸出也都可以被寫入一個檔案:
⤍ any_command > output_file
⤍ any_command >> output_file
上面這兩個指令都是輸出到一個檔案,差別在於>
運算子會建立或覆蓋原檔內容,>>
運算子會新增至原檔內容。
你也可以把標準錯誤寫入一個檔案:
⤍ any_command 2> error_file
上面的指令僅會把標準錯誤寫入,標準輸出則會輸出至螢幕上。
如果想要把標準輸出及標準錯誤都寫入檔案裡,你可以:
⤍ any_command > output_file 2> error_file
⤍ any_command >& both_file
⤍ any_command &> both_file
上面指令除了第一個是分開寫入不同檔案,剩下兩個都是寫入同一個檔案。
管線處理(Pipes)
你可以使用|
運算子來重導向(Redirect)一個指令的標準輸出到另一個指令的標準輸入,如下:
⤍ who | sort
會把who
的輸出變成sort
的輸入並把最後的輸出顯示在螢幕上。
你也可以使用多個管線:
⤍ who | sort | awk '{print $1}' | less
管線只有第一個指令是在父Shell執行,剩下的指令都在子Shell中執行,所以如果我們讓一個會把執行結果存到環境變數的指令在子Shell執行,我們將來無法從父Shell取得結果,如下:
⤍ echo "test" | read
⤍ echo $REPLY
read
簡單來說就是把讀取到的輸入存到環境變數REPLY
中,但由於read
在子Shell執行,結束後子Shell被清除,環境變數REPLY
自然也被銷毀,所以父Shell無法取得資料。
幸運的是,我們可以使用進程替換的方式來解決這個問題。
發佈留言