我有一个处理 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 directoryexit status 1然而,如果第二个 exec 命令是硬编码的,一切都会按预期工作并打印 uname:response, err := exec.Command("/usr/bin/uname", args...).Output()我是否缺少有关 exec 和字符串行为方式的信息?
1 回答
慕神8447489
TA贡献1780条经验 获得超1个赞
该which
命令在可执行文件的名称后面打印一个换行符。该path
变量设置为"/usr/bin/uname\n"
。此路径没有可执行文件。额外的换行符在错误消息中可见(“:”之前的换行符)。
修剪换行符后缀以获得可执行文件的正确名称:
response, err := exec.Command(strings.TrimSuffix(string(path), "\n"), args...).Output()
- 1 回答
- 0 关注
- 363 浏览
添加回答
举报
0/150
提交
取消