如何使用golang运行内置的shell命令

j2cgzkjk  于 2023-08-01  发布在  Go
关注(0)|答案(2)|浏览(116)

我试图在golang中运行一个内置的shell命令并获得结果。下面是代码:

package main

import (
    "fmt"
    "os/exec"
)

func main(){
    cmd := exec.Command("sh", "-c", "history")
    stdout, err := cmd.Output()
    
    if err != nil {
        fmt.Println(err.Error())
        return
    }

    fmt.Println(string(stdout))
}

字符串
但是我只得到输出:

exit status 127


如果你能帮忙的话,我会很感激的。

lawou6xi

lawou6xi1#

"bash", "-c"创建了一个非交互式的bash,它的下一个命令将假定为非交互式运行。根据我的研究,历史不支持非交互式shell。这就是为什么history命令单独使用"bash", "-c", "history"时不输出任何内容
我发现的解决方法:

package main

import (
    "fmt"
    "os/exec"
)

func main(){
    cmd := exec.Command("bash", "-c", "history -r ~/.bash_history; history")
    stdout, err := cmd.Output()
    
    if err != nil {
        fmt.Println(err.Error())
        return
    }

    fmt.Println(string(stdout))
}

字符串
如果您使用的是另一个shell,可能需要将bash~/.bash_history替换为与另一个shell相关的相应值。我不知道:/

详情:

How to view the output of history from a non-interactive shell given path to HISTFILE?
bash -c and noninteractive shell
Why does the history command do nothing in a script file?
如果我提供的任何信息是错误的,请通知我。我根据我在Details下发布的网站做出了这个回答。

kknvjkwl

kknvjkwl2#

问题是sh -c history不起作用。您正在启动的shell没有该命令。history不是标准的POSIX命令。
你可能在一个/bin/sh恰好是Dash的系统上。
如果sh恰好是Bash,则history命令将成功执行,即使Bash作为sh调用; Bash不会在POSIX模式下隐藏该命令。
在我这里的一个系统上:

$ sh -c history
sh: 1: history: not found
$ dash -c history
dash: 1: history: not found
$ bash -c history
$ bash --posix -c history
$ bash --posix -c history
$ ln -sf /bin/bash ./sh
$ ./sh -c history
$ rm sh

字符串

相关问题