使用Go的syscall.Exec调用psql报错:no such file or directory
解决Go中调用psql提示"no such file or directory"的问题
问题原因
syscall.Exec 要求第一个参数传入可执行文件的绝对路径,它不会像终端shell那样自动通过PATH环境变量查找命令位置。终端能正常运行psql是因为shell帮你完成了路径查找,但Go的syscall.Exec不具备这个能力。
两种解决方案
方案一:使用psql的绝对路径
先在终端执行 which psql 得到psql的绝对路径(比如/usr/local/bin/psql),然后替换到代码中:
package main import ( "fmt" "os" "syscall" ) func main() { // 替换为which psql输出的绝对路径 psqlAbsPath := "/usr/local/bin/psql" args := []string{"psql", "--version"} fmt.Println(args) err := syscall.Exec(psqlAbsPath, args, os.Environ()) panic(err) }
方案二:使用os/exec包(更推荐)
os/exec包会自动通过PATH查找可执行文件,还能方便捕获命令输出,且不会替换当前Go进程:
package main import ( "fmt" "os/exec" ) func main() { cmd := exec.Command("psql", "--version") // 获取命令的标准输出和错误输出 output, err := cmd.CombinedOutput() if err != nil { panic(err) } fmt.Println(string(output)) }
内容的提问来源于stack exchange,提问作者fraserc182
相关产品推荐
相关产品推荐

