2016-09-24 6 views
3

Я пытаюсь использовать os.StartProcess, чтобы начать процесс с аргументов на машине 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'. 

Когда я использую код идти над ним будут жалобы об отсутствии аргументов, так почему мой аргумент «установить» не добавляется к команде, и как исправить мой код?

ответ

0

Первый элемент args - это имя процесса. args[1] - это фактический первый аргумент. Это точно так же, как os.Argsargv в C) перечисляет работу. Чтобы не обращаться к этим данным низкого уровня, вы должны просто использовать пакет os/exec для запуска внешних процессов.

+0

Это очень непрозрачно. Сначала я попытался использовать 'os/exec', но он дал мне« код ошибки 1 »каждый раз, что я предположил как« аргумент ошибки ». Затем я перешел к исходному коду, чтобы узнать, что это может означать, и закончил работу с 'os.StartProcess'. Возможно, 'os/exec' также ожидает имя и снова то же имя, что и первый аргумент? – Bazzz