Golang中如何通过命令行传递输入参数

Golang中如何通过命令行传递输入参数 你好,我想向一个命令传递输入。

实际上,我想执行一个会询问输入的命令。

例如:

update_euql --kri

运行后,这个命令会显示:

updating the euql via kri command. Do You want to try another method [y/n]

我想向这个命令传递 n

在 Go 语言中如何实现?

3 回复

你需要 flag 包。你可以在此处找到文档和示例。

更多关于Golang中如何通过命令行传递输入参数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


要向通过 exec.Command 启动的进程传递输入,请参考以下示例:

https://golang.org/pkg/os/exec/#example_Cmd_StdinPipe

package main

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

func main() {
	cmd := exec.Command("cat")
	stdin, err := cmd.StdinPipe()
	if err != nil {
		log.Fatal(err)
	}

	go func() {
		defer stdin.Close()
		io.WriteString(stdin, "values written to stdin are passed to cmd's standard input")
	}()

	out, err := cmd.CombinedOutput()
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("%s\n", out)
}

在Go中可以通过os/exec包配合标准输入(stdin)向命令行传递输入参数。以下是具体实现方式:

package main

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

func main() {
    // 创建命令
    cmd := exec.Command("update_euql", "--kri")
    
    // 获取标准输入管道
    stdin, err := cmd.StdinPipe()
    if err != nil {
        fmt.Printf("Error creating stdin pipe: %v\n", err)
        os.Exit(1)
    }
    
    // 启动命令
    if err := cmd.Start(); err != nil {
        fmt.Printf("Error starting command: %v\n", err)
        os.Exit(1)
    }
    
    // 向命令写入输入 "n\n"(包含换行符)
    if _, err := stdin.Write([]byte("n\n")); err != nil {
        fmt.Printf("Error writing to stdin: %v\n", err)
        os.Exit(1)
    }
    
    // 关闭输入管道
    stdin.Close()
    
    // 等待命令完成
    if err := cmd.Wait(); err != nil {
        fmt.Printf("Command finished with error: %v\n", err)
    }
}

如果需要处理交互式命令的多个输入,可以使用缓冲区和循环:

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "os/exec"
    "strings"
)

func main() {
    cmd := exec.Command("update_euql", "--kri")
    
    // 设置标准输入、输出、错误
    stdin, _ := cmd.StdinPipe()
    stdout, _ := cmd.StdoutPipe()
    stderr, _ := cmd.StderrPipe()
    
    // 启动命令
    if err := cmd.Start(); err != nil {
        fmt.Printf("Error: %v\n", err)
        os.Exit(1)
    }
    
    // 读取输出的goroutine
    go func() {
        scanner := bufio.NewScanner(stdout)
        for scanner.Scan() {
            line := scanner.Text()
            fmt.Println("Output:", line)
            
            // 检测到特定提示时自动回复
            if strings.Contains(line, "Do You want to try another method [y/n]") {
                stdin.Write([]byte("n\n"))
            }
        }
    }()
    
    // 读取错误输出的goroutine
    go func() {
        errBytes, _ := io.ReadAll(stderr)
        if len(errBytes) > 0 {
            fmt.Printf("Error output: %s\n", errBytes)
        }
    }()
    
    // 等待命令完成
    cmd.Wait()
}

如果只需要传递简单的参数而不需要交互,可以直接使用命令行参数:

package main

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

func main() {
    // 如果命令支持直接传递参数
    cmd := exec.Command("update_euql", "--kri", "--answer", "n")
    
    output, err := cmd.CombinedOutput()
    if err != nil {
        fmt.Printf("Error: %v\n", err)
    }
    
    fmt.Printf("Output: %s\n", output)
}
回到顶部