Go:在 exec.Command 中使用字符串时出现奇怪的结果

我有一个处理 Linux CLI 命令及其参数的 Go 函数:


func cmd(cmd string, args ...string) ([]byte, error) {

    path, err := exec.Command("/usr/bin/which", cmd).Output()

    if err != nil {

        return []byte(""), err

    }

    response, err := exec.Command(string(path), args...).Output()

    if err != nil {

        response = []byte("Unknown")

    }

    return response, err

}

由以下调用:


func main() {

    uname, err := cmd("uname", "-a")

    fmt.Println(string(uname))

}

“which”命令返回二进制文件的正确路径,但是当它尝试使用动态路径运行第二个 exec 命令时,返回始终是:


fork/exec /usr/bin/uname

: no such file or directory

exit status 1

然而,如果第二个 exec 命令是硬编码的,一切都会按预期工作并打印 uname:


response, err := exec.Command("/usr/bin/uname", args...).Output()

我是否缺少有关 exec 和字符串行为方式的信息?


慕标琳琳
浏览 364回答 1
1回答

慕神8447489

该which命令在可执行文件的名称后面打印一个换行符。该path变量设置为"/usr/bin/uname\n"。此路径没有可执行文件。额外的换行符在错误消息中可见(“:”之前的换行符)。修剪换行符后缀以获得可执行文件的正确名称: response, err := exec.Command(strings.TrimSuffix(string(path), "\n"), args...).Output()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go