为了账号安全,请及时绑定邮箱和手机立即绑定

当传递的参数是以前运行的 exec 的输出时,为什么 os/exec 命令不能按预期工作?

当传递的参数是以前运行的 exec 的输出时,为什么 os/exec 命令不能按预期工作?

Go
尚方宝剑之说 2022-09-26 17:41:35
我正在尝试使用戈兰在浏览器上打开给定的URL。当我使用此代码时,它按预期工作并在浏览器中打开给定的URL:func main() {    url := "https://google.com"    fmt.Printf(url)    cmd := exec.Command("open", url)    var out bytes.Buffer    var stderr bytes.Buffer    cmd.Stdout = &out    cmd.Stderr = &stderr    err := cmd.Run()        if err != nil {        fmt.Println(fmt.Sprint(err) + ": " + stderr.String())    }}输出(打开浏览器):~/workspace/go/so ❯ go run main.gohttps://google.com%但是当我使用 的输出作为第二个调用的参数时,程序返回如下错误:exec.Command("echo", "https://google.com")exec.Commandfunc main() {    output, err := exec.Command("echo", "https://google.com").Output()    if err != nil {        fmt.Println(err)    }    url := string(output)    fmt.Printf(url)    cmd := exec.Command("open", url)    var out bytes.Buffer    var stderr bytes.Buffer    cmd.Stdout = &out    cmd.Stderr = &stderr    err = cmd.Run()        if err != nil {        fmt.Println(fmt.Sprint(err) + ": " + stderr.String())    }}输出(错误中有当前目录路径作为 URL 后面的路径):~/workspace/go/so ❯ go run main.gohttps://google.comexit status 1: The file /Users/kadir/workspace/go/so/https:/google.com does not exist.我在第二个代码块中做错了什么?我的go版本是1.17,文件是这样的:go.modmodule sogo 1.17require github.com/urfave/cli/v2 v2.3.0require (    github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect    github.com/russross/blackfriday/v2 v2.1.0 // indirect    github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect)
查看完整描述

1 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

如前所述@JimB在命令输出的末尾有一个隐式换行符。

最好使用谓词来确保输出中没有恶意字符:fmt%q

 fmt.Printf("%q\n", url)  // "https://google.com\n"

因此,在源位置修复此问题,使用 来抑制换行符:echo -n

output, err := exec.Command("echo", "-n", "https://google.com").Output()

或在接收端:

url = strings.TrimSpace(url)


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信