← Kembali ke kursus
Pelajaran kursus · Go
Pelajaran 44

Exec

Jalankan program lain dari kode Go.

Pahami konsepnya

os/exec menjalankan perintah eksternal seolah kamu mengetiknya di terminal: exec.Command("git", "status") menyiapkan proses baru. Panggil .Output() untuk menjalankan sambil menangkap stdout — hasilnya []byte plus error; .CombinedOutput() menggabungkan stdout dan stderr; .Run() sekadar menjalankan tanpa peduli keluaran.

Argumen perintah dikirim terpisah — bukan satu string utuh — sehingga tanpa shell, tanpa risiko injeksi. Bila kamu benar-benar butuh fitur shell (pipe, wildcard), bungkus dengan exec.Command("sh", "-c", "ls *.go | wc -l") dengan input yang sudah tervalidasi.

Exit code non-nol dilaporkan sebagai error bertipe *exec.ExitError — cek lewat errors.As untuk membedakan "program gagal" dari "program tidak ada". Untuk interaksi dua arah (kirim input, baca keluaran mengalir), Command menyediakan StdinPipe dan StdoutPipe.

Coba contoh kode

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    keluar, err := exec.Command("go", "version").Output()
    if err != nil {
        fmt.Println("gagal:", err)
        return
    }
    fmt.Print(string(keluar))
}

Command("go", "version") mencari binary go di PATH lalu menjalankannya dengan satu argumen. Output() menunggu proses selesai dan menyerahkan stdout-nya — di sini versi Go tercetak persis seperti di terminal. Bila perintah tidak ditemukan, err berisi kesalahan exec.

Exit code dan stderr

func main() {
    _, err := exec.Command("git", "status").CombinedOutput()

    var exitErr *exec.ExitError
    if errors.As(err, &exitErr) {
        fmt.Println("git keluar dengan kode:", exitErr.ExitCode())
    } else if err != nil {
        fmt.Println("git tidak tersedia:", err)
    } else {
        fmt.Println("git berjalan bersih")
    }
}

Ada dua rasa kegagalan: program berjalan tapi gagal (ExitError, memuat kode keluar dan stderr) versus program sama sekali tidak ditemukan (error biasa). errors.As memisahkannya — di luar folder git, contoh ini mencetak kode keluar 128.

Latihan singkat

Uji: jalankan perintah yang pasti tidak ada dan tangkap errornya dengan errors.As — program harus mencetak persis `perintah tidak ditemukan`.