【问题标题】:Different result between run bash command directly and through exec.Command直接运行 bash 命令和通过 exec.Command 运行结果不同
【发布时间】:2017-10-13 02:30:41
【问题描述】:

在 Linux 操作系统上,运行“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 命令的正确帮助信息。我认为这意味着它确实在我的可执行路径中。

【问题讨论】:

标签: go command exec


【解决方案1】:

如果您在 shell(例如 bash)中运行命令,tilde-prefix 在传递给 realpath 之前由 shell 扩展。

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

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

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

//3. tilde expansion
realpath ~/bin

(2) 应该失败了,你的 go 应用中的情况与此类似。要进行验证,请按如下方式更改您的 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 命令产生的错误信息。

【讨论】:

    猜你喜欢
    • 2021-03-20
    • 1970-01-01
    • 2022-09-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多