首頁 > 後端開發 > Golang > 為什麼 Go 的 exec.Command() 中的管道命令失敗,該如何修復?

為什麼 Go 的 exec.Command() 中的管道命令失敗,該如何修復?

Susan Sarandon
發布: 2024-12-16 11:03:14
原創
114 人瀏覽過

Why Does Piping Commands in Go's `exec.Command()` Fail, and How Can I Fix It?

使用exec.Command() 在Go 中執行管道指令

問題:管道指令失敗,退出狀態為1

嘗試使用exec.Command()透過管線傳輸指令時,出現下列錯誤發生:

ps, "cax | grep myapp"
登入後複製

為什麼這個指令在 ps cax 運作時失敗?

A:使用exec.Command() 進行慣用管道

透過bash 的整個命令可以解決該問題,但還有一個更慣用的方法解決方案:

  1. 為每個步驟建立單獨的命令(ps 和grep)。
  2. 使用管道連接它們的標準輸入和輸出。
  3. 先執行ps,然後執行grep .

程式碼範例:

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    grep := exec.Command("grep", "redis")
    ps := exec.Command("ps", "cax")

    // Connect ps's stdout 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))
}
登入後複製

說明:說明:

  • grep 和ps 作為單獨的命令建立。
  • 建立管道從 ps 的 stdout 到 grep 的 stdin。
  • ps 已啟動首先,確保其輸出可用於 grep。
  • 然後執行 grep 並檢索其輸出,提供所需的結果。

以上是為什麼 Go 的 exec.Command() 中的管道命令失敗,該如何修復?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板