Go:与exec.Command一起使用字符串时出现奇怪的结果

时间:2014-09-10 00:54:53

标签: linux string go exec

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

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))
}

"""命令返回二进制文件的正确路径,但当它尝试使用动态路径运行第二个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和字符串行为的内容?

谢谢

1 个答案:

答案 0 :(得分:4)

which命令在可执行文件的名称后面输出换行符。 path变量设置为"/usr/bin/uname\n"。此路径没有可执行文件。错误消息中显示了额外的换行符(":"之前的换行符。)

修剪换行符后缀以获取可执行文件的正确名称:

 response, err := exec.Command(strings.TrimSuffix(string(path), "\n"), args...).Output()