golang子进程的的标准输出和标准错误
2018-04-11 本文已影响79人
CodingCode
golang子进程的的标准输出和标准错误
使用exec.Run()运行子进程的时候,子进程的标准输入输出在哪里呢。
看下面的例子,运行主进程时,子进程sub.sh的输出会不会到屏幕(主进程的输出呢)
package main
import (
"log"
"os/exec"
)
func main() {
cmd := exec.Command("./sub.sh")
err := cmd.Run();
if err != nil {
log.Fatal(err)
}
}
子进程如下:
$ cat sub.sh
#!/bin/bash
echo "1111"
1>&2 echo "2222"
运行结果
$ ./main
$
什么也没有输出。
分析子进程的fd属性
$ ls -l /proc/<subprocesspid>/fd/
total 0
lr-x------. 1 ... 64 Apr 12 03:28 0 -> /dev/null
l-wx------. 1 ... 64 Apr 12 03:28 1 -> /dev/null
l-wx------. 1 ... 64 Apr 12 03:27 2 -> /dev/null
可以看到子进程的stdin/stdout/stderr都设置到了/dev/null所以什么也没有。
如何让它输出到屏幕呢
package main
import (
"os"
"log"
"os/exec"
)
func main() {
cmd := exec.Command("./sub.sh")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run();
if err != nil {
log.Fatal(err)
}
}
需要设置cmd的Stdout和Stderr,再运行我们可以看到子进程的fd属性
lr-x------. 1 ... 64 Apr 12 03:30 0 -> /dev/null
lrwx------. 1 ... 64 Apr 12 03:30 1 -> /dev/pts/12
lrwx------. 1 ... 64 Apr 12 03:30 2 -> /dev/pts/12
stdout和stderr同时指向了当前终端。