亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當傳遞的參數是以前運行的 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 關注
  • 97 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號