// В предыдущем примере мы рассмотрели [порождение внешних // процессов](spawning-processes). Мы делаем это, // когда нам нужен внешний процесс, доступный для // запущенного процесса Go. Иногда мы просто хотим // полностью заменить текущий процесс Go другим // (возможно, не Go). Для этого мы будем использовать // реализацию Go-имплементацию классической функции // exec. 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) } }