gpt4 book ai didi

bash - os.exec.Command 和 pbcopy

转载 作者:数据小太阳 更新时间:2023-10-29 03:07:01 25 4
gpt4 key购买 nike

我正在尝试执行 bash 命令 "hello world"|/usr/bin/pbcopy 里面Go:

package main

import (
"fmt"
"os/exec"
"strings"
)

func Cmd(cmd string) {
fmt.Println("command is ", cmd)
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.Println("out")
fmt.Println(string(out))
}

func main() {
Cmd(`echo "hello world" | /usr/bin/pbcopy`)
}

当我运行这个 go 文件时,它输出:

command is  echo "hello world" | /usr/bin/pbcopy
out
"hello world" | /usr/bin/pbcopy

我希望剪贴板等于“hello world”,但事实并非如此。

更新

我试过使用io.Pipe

package main

import (
"bytes"
"io"
"os"
"os/exec"
)

func main() {
c1 := exec.Command(`echo "hello world"`)
c2 := exec.Command("/usr/bin/pbcopy")

r, w := io.Pipe()
c1.Stdout = w
c2.Stdin = r

var b2 bytes.Buffer

c2.Stdout = &b2

c1.Start()
c2.Start()
c1.Wait()
w.Close()
c2.Wait()
io.Copy(os.Stdout, &b2)
}

...但是剪贴板仍然不等于“hello world”

最佳答案

Command 接受一个可执行文件和一个参数列表。所以当你调用

exec.Command(`echo "hello world"`)

从字面上看,它试图运行一个名为 echo "hello world" 的命令(带空格和引号)。如您所知,exec.Command 不会将内容传递给 shell,因此“|”这样也行不通。因此,如果您要通过将 stdout 和 stdin 捆绑在一起来将它们拼凑在一起,它看起来像这样:

func main() {
c1 := exec.Command("echo", "hello world")
c2 := exec.Command("/usr/bin/pbcopy")

c1stdout, _ := c1.StdoutPipe()
c2stdin, _ := c2.StdinPipe()

c1.Start()
c2.Start()

io.Copy(c2stdin, c1stdout)

c2stdin.Close()
c2.Wait()
}

但这一切都没有必要。你有一个外壳。如果您要求,它可以为您完成所有这些工作。

func main() {
exec.Command("sh", "-c", `echo "hello world" | pbcopy`).Run()
}

关于bash - os.exec.Command 和 pbcopy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30095870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com