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

标签 linux string go exec

我有一个处理 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 和字符串行为方式的信息?

谢谢

最佳答案

which 命令在可执行文件名称后面打印一个换行符。 path 变量设置为 “/usr/bin/uname\n”。此路径没有可执行文件。错误消息中可以看到额外的换行符(“:”之前的换行符)。

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

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

关于linux - Go:在 exec.Command 中使用字符串时出现奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25755746/

相关文章:

linux - 从源代码构建软件比从包管理器安装它们有什么优势吗?

python - 使用多个命令运行子进程并分离到后台保持顺序

linux - bash -x 或 set -x

c - 查找字符串中某个字符的第一个索引

c++ - 正则表达式匹配产生意外结果

go - 非法base64数据报错信息

go pprof 在不同的平台上不起作用

linux - Linux 脚本的问题

c++ - 将字符串的填充构造函数与初始化列表一起使用

database - 在 Go 中为 SQL 连接设置 TCP 超时