Compare commits

..

1 Commits

Author SHA1 Message Date
sammyette 2de1d26b39
Merge d6eb92f321 into ea233facc8 2024-07-27 15:05:55 -04:00
1 changed files with 11 additions and 14 deletions

25
exec.go
View File

@ -259,7 +259,6 @@ func execCommand(cmd string, strms *streams) (io.Writer, io.Writer, error) {
} }
interp.StdIO(strms.stdin, strms.stdout, strms.stderr)(runner) interp.StdIO(strms.stdin, strms.stdout, strms.stderr)(runner)
interp.Env(nil)(runner)
buf := new(bytes.Buffer) buf := new(bytes.Buffer)
printer := syntax.NewPrinter() printer := syntax.NewPrinter()
@ -372,7 +371,7 @@ func execHandle(bg bool) interp.ExecHandlerFunc {
return interp.NewExitStatus(exitcode) return interp.NewExitStatus(exitcode)
} }
path, err := lookpath(args[0]) err := lookpath(args[0])
if err == errNotExec { if err == errNotExec {
return execError{ return execError{
typ: "not-executable", typ: "not-executable",
@ -393,16 +392,15 @@ func execHandle(bg bool) interp.ExecHandlerFunc {
killTimeout := 2 * time.Second killTimeout := 2 * time.Second
// from here is basically copy-paste of the default exec handler from // from here is basically copy-paste of the default exec handler from
// sh/interp but with our job handling // sh/interp but with our job handling
path, err := interp.LookPathDir(hc.Dir, hc.Env, args[0])
if err != nil {
fmt.Fprintln(hc.Stderr, err)
return interp.NewExitStatus(127)
}
env := hc.Env env := hc.Env
envList := make([]string, 0, 64) envList := make([]string, 0, 64)
env.Each(func(name string, vr expand.Variable) bool { env.Each(func(name string, vr expand.Variable) bool {
if name == "PATH" {
pathEnv := os.Getenv("PATH")
envList = append(envList, "PATH="+pathEnv)
return true
}
if !vr.IsSet() { if !vr.IsSet() {
// If a variable is set globally but unset in the // If a variable is set globally but unset in the
// runner, we need to ensure it's not part of the final // runner, we need to ensure it's not part of the final
@ -420,7 +418,6 @@ func execHandle(bg bool) interp.ExecHandlerFunc {
} }
return true return true
}) })
cmd := exec.Cmd{ cmd := exec.Cmd{
Path: path, Path: path,
Args: args, Args: args,
@ -503,7 +500,7 @@ func handleExecErr(err error) (exit uint8) {
return return
} }
func lookpath(file string) (string, error) { // custom lookpath function so we know if a command is found *and* is executable func lookpath(file string) error { // custom lookpath function so we know if a command is found *and* is executable
var skip []string var skip []string
if runtime.GOOS == "windows" { if runtime.GOOS == "windows" {
skip = []string{"./", "../", "~/", "C:"} skip = []string{"./", "../", "~/", "C:"}
@ -512,20 +509,20 @@ func lookpath(file string) (string, error) { // custom lookpath function so we k
} }
for _, s := range skip { for _, s := range skip {
if strings.HasPrefix(file, s) { if strings.HasPrefix(file, s) {
return file, findExecutable(file, false, false) return findExecutable(file, false, false)
} }
} }
for _, dir := range filepath.SplitList(os.Getenv("PATH")) { for _, dir := range filepath.SplitList(os.Getenv("PATH")) {
path := filepath.Join(dir, file) path := filepath.Join(dir, file)
err := findExecutable(path, true, false) err := findExecutable(path, true, false)
if err == errNotExec { if err == errNotExec {
return "", err return err
} else if err == nil { } else if err == nil {
return path, nil return nil
} }
} }
return "", os.ErrNotExist return os.ErrNotExist
} }
func splitInput(input string) ([]string, string) { func splitInput(input string) ([]string, string) {