如何执行Shell内置命令

13

我正在尝试查找Linux上是否存在某个程序,并找到了这篇文章。我尝试从我的Go程序中执行此操作,但它一直给出错误,说无法在$PATH中找到“command”,这是可以预料的,因为它是Linux内置命令而不是二进制文件。那么我的问题是如何从Go程序内部执行Linux的内置命令?

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

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

2个回答

14

就像那篇文章所说的一样,“command”是一个shell内置命令。你可以通过exec.LookPath在go中原生实现这个功能。

如果必须这样做,你可以使用系统的which二进制文件,或者在shell中执行command

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

对于Bash用户来说,typewhich更可取(后者是一个脚本)。 - Rick-777
还要注意,Bash在今年发现了一个严重的安全漏洞,尽管已经修复。但是如果您有选择,最好为所有服务器端shell脚本使用默认的shell“sh”(通常是Dash)。 - Rick-777
1
这对我有用,但是我没有使用完整的/bin/bash路径,而是像下面这样只使用了sh exec.Command("sh", "-c", "command -v foo"),否则大多数我的执行都会出现退出错误26/27。 - joe mwirigi

1

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

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,就像直接从命令行调用它一样。

1
uuidgen不是一个内置的shell命令。内置命令包括alias、source、read、printf等。请参考https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html#Bash-Builtins。 - lyderic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接