【问题标题】:Execute any command in bash在 bash 中执行任何命令
【发布时间】:2019-10-16 17:55:26
【问题描述】:

我希望 Go 程序在 bash 终端中运行命令(包括内置命令),并将其显示在终端本身中,就像

$ls
trial.go output.txt hello.txt
$pwd
/home/bb/cc
$go run trial.go pwd
/home/bb/cc
$go run trial.go cd ..
$pwd
/home/bb

如您所见,golang 脚本将命令作为输入,并在相同的终端和环境中执行并显示输出

我尝试了以下代码,但它不适用于内置命令

cmd := exec.Command("<the input command>")
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr
    err := cmd.Run()
    if err != nil {
        log.Fatalf("cmd.Run() failed with %s\n", err)
    }

简单来说,输入的字符串会被粘贴到终端并被执行。

【问题讨论】:

  • Bash 内置命令(不出所料)仅在被 bash 解释时才有效。试试exec.Command("bash -c 'the command'")
  • 不可能像你期望的那样实现go run trial.go cd ..,因为一个进程不能改变一个祖先进程的当前工作目录。
  • exec.Command 可用于执行命令,即可以通过路径在文件系统中访问的程序。 Bash 内置程序不是命令。它们不能通过文件系统中的路径访问。它们只存在于正在运行的 Bash 进程中。
  • 除此之外,在 Go 中包装一个 shell 听起来是一个可怕的想法。我能想象的唯一原因是模仿 rsh 或 ssh 之类的东西——这将是重新发明轮子,说得客气一点。

标签: linux bash shell go terminal


【解决方案1】:

这适用于“一个单词”命令,也许您可​​以修复它以使用更多单词。希望有用。

package main

import (
"fmt"
"log"
"os/exec"
)

func main() {
    for {
    fmt.Println("Please introduce one word command (ls for example)")
    var command string
    fmt.Scan(&command)

    out, err := exec.Command(command).Output()
    if err != nil {
            log.Fatal(err)
    }
    fmt.Printf("Your output is: %s/n",out)
    }
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-27
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 2016-07-25
    相关资源
    最近更新 更多