在Go 中使用exec.Command() 透過管道執行指令
在Go 中使用exec.Command() 函數時,使用者嘗試執行涉及管道的命令時可能會遇到困難。雖然執行簡單命令很簡單,但在這些命令中使用管道可能會帶來挑戰。
問題:
在這種情況下,使用者觀察到以下命令成功執行並列印「ps」命令的輸出:
out, err := exec.Command("ps", "cax").Output()
嘗試在命令中使用管道,如下圖所示,結果錯誤:
out, err := exec.Command("ps", "cax | grep myapp").Output()
解決方案:
要解決此問題,可以考慮兩種方法:
一個選項是將整個命令列傳遞給 bash 並讓它為您執行管道。這種方法可以透過使用以下程式碼來實現:
out, err := exec.Command("bash", "-c", "ps cax | grep myapp").Output()
處理這種情況的更慣用的方法就是使用exec.Command() 函數建立兩個單獨的命令,然後連接它們的輸入和輸出流。這可以透過以下方式完成:
package main import ( "fmt" "os/exec" ) func main() { grep := exec.Command("grep", "redis") ps := exec.Command("ps", "cax") // Get ps's stdout and attach it to grep's stdin. pipe, _ := ps.StdoutPipe() defer pipe.Close() grep.Stdin = pipe // Run ps first. ps.Start() // Run and get the output of grep. res, _ := grep.Output() fmt.Println(string(res)) }
在此範例中,首先執行“ps”命令,並將其輸出通過管道傳輸到“grep”命令,該命令根據“redis”過濾輸出“細繩。
以上是如何使用 exec.Command() 在 Go 中執行管道命令?的詳細內容。更多資訊請關注PHP中文網其他相關文章!