Skip to content

proposal: os/exec: allow setting Context in Cmd #46699

@MagicalTux

Description

@MagicalTux

What version of Go are you using (go version)?

$ go version
go version go1.16 linux/amd64

Does this issue reproduce with the latest release?

Yes

What operating system and processor architecture are you using (go env)?

go env Output
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/magicaltux/.cache/go-build"
GOENV="/home/magicaltux/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/home/magicaltux/go/pkg/mod"
GONOPROXY="git.atonline.com"
GONOSUMDB="git.atonline.com"
GOOS="linux"
GOPATH="/home/magicaltux/go"
GOPRIVATE="git.atonline.com"
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/lib/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.16"
GCCGO="gccgo"
AR="ar"
CC="x86_64-pc-linux-gnu-gcc"
CXX="x86_64-pc-linux-gnu-g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build2186180239=/tmp/go-build -gno-record-gcc-switches"

What did you do?

os/exec allows spawning and settings most options of exec.Cmd without using exec.Command(), however the ctx value can only be set when invoking using exec.CommandContext().

Because I instantiate it with a number of custom settings I typically not use exec.Command() but still need to use the context.

Hence, I am requesting if ctx can be instead renamed Context so it can be set cleanly. This change can be made so it doesn't affect any existing code, and is much cleaner.

What did you expect to see?

An easy way to set Cmd.ctx:

        p := &exec.Cmd{
                Context: ctx,
                Path: argv[0],
                Args: argv,
                Dir: usr.HomeDir,
                SysProcAttr: &syscall.SysProcAttr{
                        Credential: creds,
                },
        }

What did you see instead?

This is ugly but needed because exec.Command will try to use LookPath and set lookPathErr if it fails. In this specific case I do not use lookpath because argv[0] is special and requires SysProcAttr to appear valid, so instead I give it another binary that I know will exist. LookPath will return an error even when given a full path if it doesn't appear executable.

        // create p with a fake value but the context
        p := exec.CommandContext(ctx, "/bin/true")

        // setup
        p.Path = argv[0]
        p.Args = argv
        p.Dir = usr.HomeDir
        p.SysProcAttr = &syscall.SysProcAttr{
                Credential: creds,
        }
        ...

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions