如何在 FreeBSD 上向 os.StartProcess 添加参数?

How to add arguments to os.StartProcess on FreeBSD?

我正在尝试使用 os.StartProcess 在 FreeBSD 机器上启动带参数的进程。在尝试了几种不同的方法来添加正确的参数并总是出错之后,我建立了这个简单的概念证明。

package main

import (
    "log"
    "os"
)

func main() {
    command := "/usr/local/sbin/pkg"
    args := []string{"install"}

    procAttr := new(os.ProcAttr)
    procAttr.Files = []*os.File{os.Stdin, os.Stdout, os.Stderr}
    if process, err := os.StartProcess(command, args, procAttr); err != nil {
        log.Println(err.Error())
    } else {
        log.Printf("%d", process.Pid)
    }
}

这里的想法是,如果系统仅 pkg 启动,它将抱怨缺少参数,但如果它启动 pkg install,它将建议 install 命令的帮助。见下文:

pkg: not enough arguments
Usage: pkg [-v] [-d] [-l] [-N] [-j <jail name or id>|-c <chroot path>|-r <rootdir>] [-C <configuration file>] [-R <repo config dir>] [-o var=value] [-4|-6] <command> [<args>]

For more information on available commands and options see 'pkg help'.

Usage: pkg install [-AfInFMqRUy] [-r reponame] [-Cgix] <pkg-name> ...

For more information see 'pkg help install'.

当我使用上面的 go 代码时,它会抱怨缺少参数,那么为什么我的参数 'install' 没有添加到命令中,如何更正我的代码?

args 的第一个元素是进程名称。 args[1] 是实际的第一个参数。这就像 os.Args(和 C 中的 argv)列表一样。为避免处理这些底层细节,您应该只使用 os/exec 包来启动外部进程。