|
@@ -40,6 +40,7 @@ type Parser struct {
|
|
|
ParseEnv bool
|
|
|
ParseBacktick bool
|
|
|
Position int
|
|
|
+ Dir string
|
|
|
|
|
|
// If ParseEnv is true, use this for getenv.
|
|
|
// If nil, use os.Getenv.
|
|
@@ -51,6 +52,7 @@ func NewParser() *Parser {
|
|
|
ParseEnv: ParseEnv,
|
|
|
ParseBacktick: ParseBacktick,
|
|
|
Position: 0,
|
|
|
+ Dir: "",
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -100,11 +102,11 @@ loop:
|
|
|
if !singleQuoted && !doubleQuoted && !dollarQuote {
|
|
|
if p.ParseBacktick {
|
|
|
if backQuote {
|
|
|
- out, err := shellRun(backtick)
|
|
|
+ out, err := shellRun(backtick, p.Dir)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
- buf = out
|
|
|
+ buf = buf[:len(buf)-len(backtick)] + out
|
|
|
}
|
|
|
backtick = ""
|
|
|
backQuote = !backQuote
|
|
@@ -117,15 +119,11 @@ loop:
|
|
|
if !singleQuoted && !doubleQuoted && !backQuote {
|
|
|
if p.ParseBacktick {
|
|
|
if dollarQuote {
|
|
|
- out, err := shellRun(backtick)
|
|
|
+ out, err := shellRun(backtick, p.Dir)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
- if r == ')' {
|
|
|
- buf = buf[:len(buf)-len(backtick)-2] + out
|
|
|
- } else {
|
|
|
- buf = buf[:len(buf)-len(backtick)-1] + out
|
|
|
- }
|
|
|
+ buf = buf[:len(buf)-len(backtick)-2] + out
|
|
|
}
|
|
|
backtick = ""
|
|
|
dollarQuote = !dollarQuote
|
|
@@ -155,7 +153,7 @@ loop:
|
|
|
continue
|
|
|
}
|
|
|
case ';', '&', '|', '<', '>':
|
|
|
- if !(escaped || singleQuoted || doubleQuoted || backQuote) {
|
|
|
+ if !(escaped || singleQuoted || doubleQuoted || backQuote || dollarQuote) {
|
|
|
if r == '>' && len(buf) > 0 {
|
|
|
if c := buf[0]; '0' <= c && c <= '9' {
|
|
|
i -= 1
|