2010-01-27 5 views
3

Я хочу создать массив exec.Cmd и соединить их вместе, чтобы сделать аутентификатор кальмаров. Он работает, когда в командах файл нет аргументов. С аргументами он читает только EOF. Я проверил массив argv, и его содержимое в порядке.exec.Run and argv problem

Соответствующая часть кода:

func initCmd(file *os.File) []* exec.Cmd { 
    var cmd  [MAX_PROC]* exec.Cmd; 
    var e  os.Error 

    // Initialize the commands in the config file 
    environ := os.Environ(); 
    var i int 
    for i=0; i < MAX_PROC; i++ { 
     line := getLine(file) 
     if line == "" { break } 
     parts := strings.Fields(line) 
     cmd[i], e = exec.Run(parts[0], parts[1:], environ, 
          exec.Pipe, exec.Pipe, exec.Pipe) 
     exitOnError(&e) 
    } 
    return cmd[0:i] 
} 

Любые идеи? Спасибо.

PS: Если это помогает, полный источник программы находится в github.

ответ

4

Арги должны также включать arg0. Попробуйте exec.Run (детали [0], части)

Я открыл вопрос о том, как это сбивает с толку, но они утверждают, что он работает как задумано: http://code.google.com/p/go/issues/detail?id=428

+0

Теперь это некрасиво дизайн API. С аргументами ключевого слова они могли бы подойти к более удобному подпроцессу: http://docs.python.org/library/subprocess.html#subprocess.Popen – Tobu

+0

Это уродливо, потому что они более или менее скопировали поведение стандартной функциональности библиотеки C, которая также почему они утверждают, что он работает по назначению. Фактически, они, вероятно, просто называют один из многих вариантов функции C «exec» под капотом. –