运行 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
命令产生的错误消息。
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
命令产生的错误消息。