我有一个处理 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/