猿问

Golang 'exec.Command' 对待单引号参数特殊吗?

我指的是如何使用未知参数执行系统命令?在我的 ubuntu shell 上运行 jq 命令。下面是我试过的代码


import (

    "fmt"

    "os/exec"

    "sync"

    "strings"

)


func exeCmd(cmd string, wg *sync.WaitGroup) {

    fmt.Println("command is ",cmd)

    // splitting head => g++ parts => rest of the command

    parts := strings.Fields(cmd)

    head := parts[0]

    parts = parts[1:len(parts)]

  

    out, err := exec.Command(head,parts...).Output()

    if err != nil {

      fmt.Printf("%s", err)

    }

    fmt.Printf("%s", out)

    wg.Done() // Need to signal to waitgroup that this goroutine is done

  }


func main() {

    wg := new(sync.WaitGroup)

    wg.Add(1)


    x := []string{"jq '(.data.legacyCollection.collectionsPage.stream.edges|map({node:(.node|{url,firstPublished,headline:{default:.headline.default},summary})})) as $edges|{data:{legacyCollection:{collectionsPage:{stream:{$edges}}}}}' long-response.json > short-response.json"}


    exeCmd(x[0], wg)


    wg.Wait()

}

输出如下,似乎命令被正确检测到,但 shell 返回退出状态 3,即“没有这样的过程”?


command is  jq '(.data.legacyCollection.collectionsPage.stream.edges|map({node:(.node|{url,firstPublished,headline:{default:.headline.default},summary})})) as $edges|{data:{legacyCollection:{collectionsPage:{stream:{$edges}}}}}' long-response.json > short-repsonse.json exit status 3

任何人都可以帮忙吗?我想要的是一个 go 函数,它可以像在 Linux shell 上一样包装和运行 bash 命令行


尝试了其他方法:删除了我的 jq 命令中的单引号,我的命令得到了我期望的输出执行 - 一个解析的 json 文件但是,我仍然有一个存在状态 2,任何人都可以解释

  1. 为什么我的命令行中的单引号会影响 G 解析命令的方式?

  2. 为什么在我的 shell 命令完成后我仍然存在 2?


慕勒3428872
浏览 189回答 1
1回答

幕布斯6054654

该程序执行 jq 命令,而不是 shell。jq 命令不理解传递给命令的 shell 语法(引号和 I/O 重定向)。使用以下代码运行命令,标准输出重定向到 short-response.json。cmd := exec.Command("jq",    "(.data.legacyCollection.collectionsPage.stream.edges|map({node:(.node|{url,firstPublished,headline:{default:.headline.default},summary})})) as $edges|{data:{legacyCollection:{collectionsPage:{stream:{$edges}}}}}",    "long-response.json")f, err := os.Create("short-response.json")if err != nil {    log.Fatal(err)}defer f.Close()cmd.Stdout = f  // set stdout to short-response.jsonerr = cmd.Run()if err != nil {    log.Fatal(err)}
随时随地看视频慕课网APP

相关分类

Go
我要回答