gobyexample/examples/execing-processes/execing-processes.go
2019-10-12 21:55:39 +03:00

49 lines
2.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// В предыдущем примере мы рассмотрели [порождение внешних
// процессов](spawning-processes). Мы делаем это,
// когда нам нужен внешний процесс, доступный для
// запущенного процесса Go. Иногда мы просто хотим
// полностью заменить текущий процесс Go другим
// (возможно, не Go). Для этого мы будем использовать
// реализацию Go-имплементацию классической функции
// <a href="http://en.wikipedia.org/wiki/Exec_(operating_system)"><code>exec</code></a>.
package main
import (
"os"
"os/exec"
"syscall"
)
func main() {
// Для нашего примера мы выполним `ls`. Go требует
// абсолютного пути к двоичному файлу, который мы
// хотим выполнить, поэтому мы используем `exec.LookPath`,
// чтобы найти его (вероятно, `/bin/ls`).
binary, lookErr := exec.LookPath("ls")
if lookErr != nil {
panic(lookErr)
}
// `Exec` требует аргументы в форме среза
// (в сочетании с одной большой строкой). Мы используем в `ls`
// несколько общих аргументов. Обратите внимание, что
// первым аргументом должно быть имя программы.
args := []string{"ls", "-a", "-l", "-h"}
// `Exec` также нужен набор [переменных среды](environment-variables)
// для использования. Здесь мы просто предоставляем
// нашу текущую среду.
env := os.Environ()
// Вот фактический вызов `syscall.Exec`. Если этот вызов
// будет успешным, выполнение нашего процесса на этом
// закончится и будет заменено процессом `/bin/ls -a -l -h`.
// В случае ошибки мы получим возвращаемое значение.
execErr := syscall.Exec(binary, args, env)
if execErr != nil {
panic(execErr)
}
}