mirror of
https://github.com/golang/go
synced 2024-11-25 05:57:57 -07:00
exec: add dir argument to Run.
fix, test MergeWithStdout R=r CC=golang-dev https://golang.org/cl/214046
This commit is contained in:
parent
4589c34580
commit
c2dea2196c
@ -346,12 +346,12 @@ func run(argv []string, input []byte) (out string, err os.Error) {
|
|||||||
// fmt.Fprintf(os.Stderr, "%v\n", argv);
|
// fmt.Fprintf(os.Stderr, "%v\n", argv);
|
||||||
var cmd *exec.Cmd
|
var cmd *exec.Cmd
|
||||||
if len(input) == 0 {
|
if len(input) == 0 {
|
||||||
cmd, err = exec.Run(prog, argv, os.Environ(), exec.DevNull, exec.Pipe, exec.MergeWithStdout)
|
cmd, err = exec.Run(prog, argv, os.Environ(), "", exec.DevNull, exec.Pipe, exec.MergeWithStdout)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
goto Error
|
goto Error
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
cmd, err = exec.Run(prog, argv, os.Environ(), exec.Pipe, exec.Pipe, exec.MergeWithStdout)
|
cmd, err = exec.Run(prog, argv, os.Environ(), "", exec.Pipe, exec.Pipe, exec.MergeWithStdout)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
goto Error
|
goto Error
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,7 @@ func modeToFiles(mode, fd int) (*os.File, *os.File, os.Error) {
|
|||||||
// If a parameter is Pipe, then the corresponding field (Stdin, Stdout, Stderr)
|
// If a parameter is Pipe, then the corresponding field (Stdin, Stdout, Stderr)
|
||||||
// of the returned Cmd is the other end of the pipe.
|
// of the returned Cmd is the other end of the pipe.
|
||||||
// Otherwise the field in Cmd is nil.
|
// Otherwise the field in Cmd is nil.
|
||||||
func Run(argv0 string, argv, envv []string, stdin, stdout, stderr int) (p *Cmd, err os.Error) {
|
func Run(argv0 string, argv, envv []string, dir string, stdin, stdout, stderr int) (p *Cmd, err os.Error) {
|
||||||
p = new(Cmd)
|
p = new(Cmd)
|
||||||
var fd [3]*os.File
|
var fd [3]*os.File
|
||||||
|
|
||||||
@ -89,13 +89,13 @@ func Run(argv0 string, argv, envv []string, stdin, stdout, stderr int) (p *Cmd,
|
|||||||
goto Error
|
goto Error
|
||||||
}
|
}
|
||||||
if stderr == MergeWithStdout {
|
if stderr == MergeWithStdout {
|
||||||
p.Stderr = p.Stdout
|
fd[2] = fd[1]
|
||||||
} else if fd[2], p.Stderr, err = modeToFiles(stderr, 2); err != nil {
|
} else if fd[2], p.Stderr, err = modeToFiles(stderr, 2); err != nil {
|
||||||
goto Error
|
goto Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run command.
|
// Run command.
|
||||||
p.Pid, err = os.ForkExec(argv0, argv, envv, "", &fd)
|
p.Pid, err = os.ForkExec(argv0, argv, envv, dir, &fd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
goto Error
|
goto Error
|
||||||
}
|
}
|
||||||
|
@ -11,39 +11,76 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestRunCat(t *testing.T) {
|
func TestRunCat(t *testing.T) {
|
||||||
cmd, err := Run("/bin/cat", []string{"cat"}, nil,
|
cmd, err := Run("/bin/cat", []string{"cat"}, nil, "",
|
||||||
Pipe, Pipe, DevNull)
|
Pipe, Pipe, DevNull)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("opencmd /bin/cat: %v", err)
|
t.Fatal("run:", err)
|
||||||
}
|
}
|
||||||
io.WriteString(cmd.Stdin, "hello, world\n")
|
io.WriteString(cmd.Stdin, "hello, world\n")
|
||||||
cmd.Stdin.Close()
|
cmd.Stdin.Close()
|
||||||
buf, err := ioutil.ReadAll(cmd.Stdout)
|
buf, err := ioutil.ReadAll(cmd.Stdout)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("reading from /bin/cat: %v", err)
|
t.Fatal("read:", err)
|
||||||
}
|
}
|
||||||
if string(buf) != "hello, world\n" {
|
if string(buf) != "hello, world\n" {
|
||||||
t.Fatalf("reading from /bin/cat: got %q", buf)
|
t.Fatalf("read: got %q", buf)
|
||||||
}
|
}
|
||||||
if err = cmd.Close(); err != nil {
|
if err = cmd.Close(); err != nil {
|
||||||
t.Fatalf("closing /bin/cat: %v", err)
|
t.Fatal("close:", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRunEcho(t *testing.T) {
|
func TestRunEcho(t *testing.T) {
|
||||||
cmd, err := Run("/bin/echo", []string{"echo", "hello", "world"}, nil,
|
cmd, err := Run("/bin/echo", []string{"echo", "hello", "world"}, nil, "",
|
||||||
DevNull, Pipe, DevNull)
|
DevNull, Pipe, DevNull)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("opencmd /bin/echo: %v", err)
|
t.Fatal("run:", err)
|
||||||
}
|
}
|
||||||
buf, err := ioutil.ReadAll(cmd.Stdout)
|
buf, err := ioutil.ReadAll(cmd.Stdout)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("reading from /bin/echo: %v", err)
|
t.Fatal("read:", err)
|
||||||
}
|
}
|
||||||
if string(buf) != "hello world\n" {
|
if string(buf) != "hello world\n" {
|
||||||
t.Fatalf("reading from /bin/echo: got %q", buf)
|
t.Fatalf("read: got %q", buf)
|
||||||
}
|
}
|
||||||
if err = cmd.Close(); err != nil {
|
if err = cmd.Close(); err != nil {
|
||||||
t.Fatalf("closing /bin/echo: %v", err)
|
t.Fatal("close:", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestStderr(t *testing.T) {
|
||||||
|
cmd, err := Run("/bin/sh", []string{"sh", "-c", "echo hello world 1>&2"}, nil, "",
|
||||||
|
DevNull, DevNull, Pipe)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("run:", err)
|
||||||
|
}
|
||||||
|
buf, err := ioutil.ReadAll(cmd.Stderr)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("read:", err)
|
||||||
|
}
|
||||||
|
if string(buf) != "hello world\n" {
|
||||||
|
t.Fatalf("read: got %q", buf)
|
||||||
|
}
|
||||||
|
if err = cmd.Close(); err != nil {
|
||||||
|
t.Fatal("close:", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func TestMergeWithStdout(t *testing.T) {
|
||||||
|
cmd, err := Run("/bin/sh", []string{"sh", "-c", "echo hello world 1>&2"}, nil, "",
|
||||||
|
DevNull, Pipe, MergeWithStdout)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("run:", err)
|
||||||
|
}
|
||||||
|
buf, err := ioutil.ReadAll(cmd.Stdout)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("read:", err)
|
||||||
|
}
|
||||||
|
if string(buf) != "hello world\n" {
|
||||||
|
t.Fatalf("read: got %q", buf)
|
||||||
|
}
|
||||||
|
if err = cmd.Close(); err != nil {
|
||||||
|
t.Fatal("close:", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user