【问题标题】:How to execute a shell built-in command如何执行 shell 内置命令
【发布时间】:2015-12-11 17:45:05
【问题描述】:

我试图找出 Linux 上是否存在某个程序,我发现了这个article。我尝试从我的 go 程序中执行它,它一直给我一个错误,说它在我的 $PATH 中找不到“命令”,这是可以预料的,因为它是 linux 中的内置命令而不是二进制文件。所以我的问题是如何从 go 程序中执行 linux 的内置命令?

exec.Command("command", "-v", "foo")

错误: exec: "command": $PATH 中找不到可执行文件

【问题讨论】:

    标签: go executable


    【解决方案1】:

    正如那篇文章所说,“命令”是一个内置的 shell。您可以通过 exec.LookPath 在本地执行此操作。

    如果必须,您可以使用系统 which 二进制文件,也可以在 shell 中执行 command

    exec.Command("/bin/bash", "-c", "command -v foo")
    

    【讨论】:

    • 对于 bash 用户,type 优于 which(后者是一个脚本)。
    • 还要注意今年 bash 有一个严重的安全漏洞,尽管这个漏洞已经修复。但是,如果您可以选择,请首选默认 shell sh(通常是 Dash)用于所有服务器端 shell 脚本。
    • 这对我有用,但我没有使用完整的 /bin/bash 路径,而是使用 sh 如下 exec.Command("sh", "-c", "command -v foo") 否则对于我的大部分执行,我都收到了 26/27 的退出错误。
    【解决方案2】:

    或者,如果它是不需要参数的内置命令,您可以执行以下操作:

    package main
    
    import (
        "fmt"
        "log"
        "os/exec"
    )
    
    func main() {
        out, err := exec.Command("uuidgen").Output()
        if err != nil {
            log.Fatal(err)
        }
        fmt.Printf("%s", out)
    }
    

    这将打印出一个唯一 ID,如下所示:4cdb277e-3c25-48ef-a367-ba734ce407c1 就像直接从命令行调用它一样。

    【讨论】:

    猜你喜欢
    • 2013-10-13
    • 2015-01-03
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多