LINUX

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

資料流重導向(I/O Redirection)

Shell可以重導向(Redirect)標準輸入、標準輸出及標準錯誤到(to)一個檔案,或從(from)一個檔案到Shell也可以。也就是說,任何一個要讀取標準輸入的指令可以使用<運算子讓一個檔案作為輸入:

⤍ any_command < input_file
Code language: Bash (bash)

同樣的,任何指令的標準輸出也都可以被寫入一個檔案:

⤍ any_command > output_file ⤍ any_command >> output_file
Code language: Bash (bash)

上面這兩個指令都是輸出到一個檔案,差別在於>運算子會建立或覆蓋原檔內容,>>運算子會新增至原檔內容。

你也可以把標準錯誤寫入一個檔案:

⤍ any_command 2> error_file
Code language: Bash (bash)

上面的指令僅會把標準錯誤寫入,標準輸出則會輸出至螢幕上。

如果想要把標準輸出及標準錯誤都寫入檔案裡,你可以:

⤍ any_command > output_file 2> error_file ⤍ any_command >& both_file ⤍ any_command &> both_file
Code language: Bash (bash)

上面指令除了第一個是分開寫入不同檔案,剩下兩個都是寫入同一個檔案。

管線處理(Pipes)

你可以使用|運算子來重導向(Redirect)一個指令的標準輸出到另一個指令的標準輸入,如下:

⤍ who | sort
Code language: Bash (bash)

會把who的輸出變成sort的輸入並把最後的輸出顯示在螢幕上。

你也可以使用多個管線:

⤍ who | sort | awk '{print $1}' | less
Code language: Bash (bash)

管線只有第一個指令是在父Shell執行,剩下的指令都在子Shell中執行,所以如果我們讓一個會把執行結果存到環境變數的指令在子Shell執行,我們將來無法從父Shell取得結果,如下:

echo "test" | readecho $REPLY
Code language: Bash (bash)

read簡單來說就是把讀取到的輸入存到環境變數REPLY中,但由於read在子Shell執行,結束後子Shell被清除,環境變數REPLY自然也被銷毀,所以父Shell無法取得資料。

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

發佈留言