diff --git a/parse.go b/parse.go index 58acc13..4f3644e 100644 --- a/parse.go +++ b/parse.go @@ -107,9 +107,9 @@ func parsePipeInclude(p *parser, t token) parserStateFun { p.basicErrorAtToken("empty pipe include", t) } - args := make([]string, len(p.tokenbuf)-1) - for i := 1; i < len(p.tokenbuf); i++ { - args[i-1] = p.tokenbuf[i].val + args := make([]string, len(p.tokenbuf)) + for i := 0; i < len(p.tokenbuf); i++ { + args[i] = p.tokenbuf[i].val } output, success := subprocess("sh", args, "", true) diff --git a/recipe.go b/recipe.go index 934ae5c..c4da3a0 100644 --- a/recipe.go +++ b/recipe.go @@ -160,12 +160,11 @@ func subprocess(program string, buf := make([]byte, 1024) for { n, err := stdout_pipe_read.Read(buf) - if err != nil { - log.Fatal(err) - } - if n == 0 { + if err == io.EOF && n == 0 { break + } else if err != nil { + log.Fatal(err) } output = append(output, buf[:n]...) @@ -193,6 +192,11 @@ func subprocess(program string, }() state, err := proc.Wait() + + if attr.Files[1] != os.Stdout { + attr.Files[1].Close() + } + if err != nil { log.Fatal(err) } diff --git a/rules.go b/rules.go index 114c6da..bceb621 100644 --- a/rules.go +++ b/rules.go @@ -50,15 +50,15 @@ func (p *pattern) match(target string) []string { // A single rule. type rule struct { - targets []pattern // non-empty array of targets - attributes attribSet // rule attributes - prereqs []string // possibly empty prerequesites - shell []string // command used to execute the recipe - recipe string // recipe source - command []string // command attribute - ismeta bool // is this a meta rule - file string // file where the rule is defined - line int // line number on which the rule is defined + targets []pattern // non-empty array of targets + attributes attribSet // rule attributes + prereqs []string // possibly empty prerequesites + shell []string // command used to execute the recipe + recipe string // recipe source + command []string // command attribute + ismeta bool // is this a meta rule + file string // file where the rule is defined + line int // line number on which the rule is defined } // Equivalent recipes.