LINUX

LINUX資料流重導向與管線處理

資料流重導向(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無法取得資料。

幸運的是,我們可以使用進程替換的方式來解決這個問題。

發佈留言