为什么Go中os/exec参数为前序exec输出时运行不符合预期?
问题根因
echo命令的默认输出末尾会自动追加一个换行符\n,你直接将输出转成字符串作为URL传入open命令时,这个换行符也被一并带入了参数中。- macOS的
open命令无法识别末尾带换行符的内容为合法HTTP URL,会默认将参数当做本地文件路径处理,因此自动拼接了当前工作目录的绝对路径在你传入的内容前;同时换行符还会导致URL解析异常,https://被截断为https:/,最终触发路径不存在的错误。
修复方案
调用strings.TrimSpace()方法去除输出结果首尾的空白字符(包括末尾的换行符)即可,修复后的代码如下:
import ( "fmt" "bytes" "os/exec" "strings" ) func main() { output, err := exec.Command("echo", "https://google.com").Output() if err != nil { fmt.Println(err) } // 去除首尾空白字符(含末尾换行) url := strings.TrimSpace(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()) } }
内容的提问来源于stack exchange,提问作者kadir
相关产品推荐
相关产品推荐

