Тип os.ProcAttr
Тип os.ProcAttr представляет собой структуру, которая задает атрибуты для запуска нового процесса с помощью функции os.StartProcess.
Поле Files определяет файловые дескрипторы для стандартных потоков ввода-вывода.
Поле Dir задает рабочий каталог процесса.
Поле Env определяет переменные окружения, которые будут переданы процессу.
Синтаксис
type ProcAttr struct {
Dir string
Env []string
Files []*os.File
Sys *syscall.SysProcAttr
}
Описание полей
Поле Dir задает рабочий каталог для запускаемого процесса.
Если поле не заполнено или указана пустая строка, процесс наследует рабочий каталог родительского процесса.
Поле Env содержит переменные окружения, переданные процессу в формате "KEY=value".
Если поле не заполнено, процесс наследует переменные окружения родительского процесса.
Поле Files определяет файловые дескрипторы для стандартных потоков:
элемент с индексом 0 соответствует стандартному вводу (stdin),
индекс 1 - стандартному выводу (stdout),
индекс 2 - стандартному выводу ошибок (stderr).
Пример
Давайте запустим новую команду с настройками по умолчанию:
package main
import (
"fmt"
"os"
)
func main() {
attr := &os.ProcAttr{
Dir: "",
Env: os.Environ(),
Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
}
proc, err := os.StartProcess("/bin/echo", []string{"echo", "Hello, World!"}, attr)
if err != nil {
fmt.Println("Error:", err)
return
}
proc.Wait()
}
Результат выполнения кода:
"Hello, World!"
Пример
Давайте настроим рабочий каталог и переменные окружения:
package main
import (
"fmt"
"os"
)
func main() {
env := []string{
"USER=john",
"HOME=/home/john",
"SHELL=/bin/bash",
}
attr := &os.ProcAttr{
Dir: "/home/john",
Env: env,
Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
}
proc, err := os.StartProcess("/bin/bash", []string{"bash", "-c", "echo $USER $HOME"}, attr)
if err != nil {
fmt.Println("Error:", err)
return
}
proc.Wait()
}
Результат выполнения кода:
"john /home/john"
Пример
Давайте настроим каналы для перенаправления вывода команды:
package main
import (
"bytes"
"fmt"
"os"
)
func main() {
var stdout bytes.Buffer
r, w, err := os.Pipe()
if err != nil {
fmt.Println("Error:", err)
return
}
attr := &os.ProcAttr{
Dir: "",
Env: os.Environ(),
Files: []*os.File{os.Stdin, w, os.Stderr},
}
proc, err := os.StartProcess("/bin/echo", []string{"echo", "This is stdout"}, attr)
if err != nil {
fmt.Println("Error:", err)
return
}
w.Close()
stdout.ReadFrom(r)
proc.Wait()
fmt.Print(stdout.String())
}
Результат выполнения кода:
"This is stdout"
Смотрите также
-
функцию
os.StartProcess,
которая запускает процесс с указанными атрибутами -
тип
os.Process,
который представляет запущенный процесс -
тип
os.ProcessState,
который содержит информацию о завершенном процессе -
функцию
os.Getenv,
которая возвращает значение переменной окружения