diff --git a/src/cmd/go/internal/base/base.go b/src/cmd/go/internal/base/base.go index 2171d139096..0ba2ffd415f 100644 --- a/src/cmd/go/internal/base/base.go +++ b/src/cmd/go/internal/base/base.go @@ -14,6 +14,7 @@ import ( "os" "os/exec" "reflect" + "slices" "strings" "sync" @@ -211,7 +212,9 @@ func RunStdin(cmdline []string) { cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr - cmd.Env = cfg.OrigEnv + env := slices.Clip(cfg.OrigEnv) + env = AppendPATH(env) + cmd.Env = env StartSigHandlers() if err := cmd.Run(); err != nil { Errorf("%v", err) diff --git a/src/cmd/go/testdata/script/run_goroot_PATH.txt b/src/cmd/go/testdata/script/run_goroot_PATH.txt new file mode 100644 index 00000000000..a103cf645eb --- /dev/null +++ b/src/cmd/go/testdata/script/run_goroot_PATH.txt @@ -0,0 +1,42 @@ +# https://go.dev/issue/68005: 'go run' should run the program with its own GOROOT/bin +# at the beginning of $PATH. + +[short] skip + +[!GOOS:plan9] env PATH= +[GOOS:plan9] env path= +go run . + +[!GOOS:plan9] env PATH=$WORK${/}bin +[GOOS:plan9] env path=$WORK${/}bin +go run . + +-- go.mod -- +module example + +go 1.19 +-- main.go -- +package main + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" +) + +func main() { + got, err := exec.LookPath("go") + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + want := filepath.Join(os.Getenv("GOROOT"), "bin", "go" + os.Getenv("GOEXE")) + if got != want { + fmt.Printf(`exec.LookPath("go") = %q; want %q\n`, got, want) + os.Exit(1) + } +} +-- $WORK/bin/README.txt -- +This directory contains no executables.