运行 bash 命令直接与通过 exec.Command 命令的结果不同

Different result between run bash command directly and through exec.Command

On Linux OS, 运行 "realpath ~/bin" 给出了正确的路径“/home/user1/bin”.

但是当我 运行 它如下所示时:

cmd := exec.Command("realpath", "~/bin")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
    panic(err)
}
fmt.Println("Realapth:", out.String())

我得到了panic: exit status 1

顺便说一句:使用如下命令:

cmd := exec.Command("realpath", "--help")

我可以获得 realpath 命令的正确帮助信息。我认为这意味着它确实在我的可执行路径中。

如果您 运行 shell 中的命令(例如 bash),tilde-prefix 在传递给 realpath.

但是,如果您在 go 应用程序中 运行 它,波浪号将保持原样并且 realpath 将其假定为路径名的一部分。要查看差异,您可以在 shell (Linux OS) 中尝试以下命令:

//1. correctly expanded
realpath './bin'

//2. tilde not expanded
realpath '~/bin'

//3. tilde expansion
realpath ~/bin

(2)应该是失败了,你的go应用中的情况和这个差不多。要验证,请按如下方式更改您的代码:

cmd := exec.Command("realpath", "~/bin")
var out bytes.Buffer
var serr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &serr
err := cmd.Run()
if err != nil {
    fmt.Printf("Error = %v, %v\n", err, serr.String())
    panic(err)
}
fmt.Println("Realapth:", out.String())

您应该能够观察到 realpath 命令产生的错误消息。