gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:55:38 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com