1.2.14 【实战】用Go运行Shell脚本程序

  1. Go语言提供了os/exec包来运行Shell命令,os/exec包的Command()函数可以用于输入Shell命令,用给定参数执行指定的程序

  2. Command()函数会返回一个名为*Cmd的结构体,代表一个执行的外部命令,当调用它的Run()Output()CombinedOutput()等方法后这个对象就不能重用了

  3. 示例:执行ls命令,并传递-a参数

    cmd := exec.Command("ls", "-a")
    err := cmd.Run()
    if err != nil {
        log.Fatalf("执行失败,异常:", err)
    }

    参数:

    第一个参数是要执行的程序命令行

    其他参数是程序命令行参数

  4. 假如执行命令,控制台没有任何输出,但命令已经执行,只不过Go程序没有捕获和处理输出,所以控制台没有输出,可通过如下字段,实现定制化输入输出:

    Stdin io.Reader
    Stdout io.Writer
    Stderr io.Writer

    备注:

    1. 如果Stdin为空,程序会从null device(os.DevBull)中读取数据

    2. 如果Stdin是*os.File对象,则会从这个文件中读取数据

    3. 如果Stdin是os.Stdin,则会从标准输入(如命令行)中读取数据

    4. Stdout和Stderr代表外部程序进程的”标准输出“和”错误输出“

    5. 如果Stdout和Stderr为空,则输出到null device

    6. 如果Stdout和Stderr是*os.File对象,则会向文件中输出数据

    7. 如果Stdout和Stderr分别设置为os.Stdout、os.Stderr,则会输出到命令行中

  5. 带输出命令的示例如下:

    cmd := exec.Command("ls", "-a")
    // 标准输出
    cmd.Stdout = os.Stdout
    // 错误输出
    cmd.Stderr = os.Stderr
    err := cmd.Run()
    if err != nil {
        log.Fatalf("执行失败,异常:", err)
    }
  6. 可以通过tr命令转换输入,举例:小写换大写:

    func main() {
    	cmd := exec.Command("tr", "a-z", "A-Z")
    	cmd.Stdin = strings.NewReader("i love snow")
    
    	var out bytes.Buffer
    	cmd.Stdout = &out
    
    	err := cmd.Run()
    	if err != nil {
    		log.Fatal(err)
    	}
    	fmt.Println(out.String())
    }

    结果:I LOVE SNOW

Last updated