Golang中如何通过命令行传递输入参数
Golang中如何通过命令行传递输入参数 你好,我想向一个命令传递输入。
实际上,我想执行一个会询问输入的命令。
例如:
update_euql --kri
运行后,这个命令会显示:
updating the euql via kri command. Do You want to try another method [y/n]
我想向这个命令传递 n。
在 Go 语言中如何实现?
3 回复
要向通过 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)
}


