Linker baru saja menyerahkan executable kepada kita, dan selama course ini kita sebenarnya sudah sering menjalankannya dengan pola ./nama-program. Di balik pola sederhana itu ada beberapa mekanisme shell yang layak dipahami sekali untuk selamanya: mengapa Linux menuntut ./ di depan nama, apa itu permission eksekusi, dan bagaimana shell membaca status akhir program lewat exit code. Chapter ini juga menutup lingkaran topik dari Section Pengenalan C++ — argumen program yang dulu kita lihat dari sisi kode main(), kini kita lihat dari sisi shell penerusnya.

Menjalankan dari Terminal: Linux, macOS, Windows #

Di Linux dan macOS, program dijalankan dengan menulis path-nya; tanda ./ berarti “folder sekarang”:

bash
./salam-argumen Dewi
text
Terima kasih Dewi!

Pertanyaan yang wajar: kenapa tidak cukup mengetik salam-argumen saja? Karena shell mencari program hanya di daftar folder bernama PATH — kita bisa melihatnya berisi /usr/bin, /usr/local/bin, dan folder sistem lain — dan folder sekarang sengaja tidak ikut dicari. Ketik saja nama programnya, dan shell menjawab:

text
bash: salam-argumen: command not found

Aturan ini adalah pengaman: bila folder sekarang ikut dicari, siapa pun yang menaruh program palsu bernama ls di folder bersama bisa menggantikan perintah asli. Dengan ./, keputusan “program mana yang dijalankan” tetap di tangan kita. Sementara itu di Windows kebiasaannya berbeda: Command Prompt memang mencari folder sekarang lebih dulu, sehingga salam-argumen.exe langsung jalan, dan ekstensi .exe boleh ditulis maupun tidak. Di PowerShell modern aturan Unix diterapkan sebagian — executable di folder sekarang dipanggil dengan .\salam-argumen.exe.

Permission Executable #

Di Linux dan macOS, menjalankan program juga menuntut izin (permission) eksekusi. File hasil g++ otomatis sudah punya izin itu — kita bisa memeriksanya dengan stat:

bash
stat -c '%A %n' salam-argumen
text
-rwxr-xr-x salam-argumen

Huruf x pada rwxr-xr-x itulah izin eksekusi: pemilik, grup, dan pengguna lain semuanya boleh menjalankan file ini. Izin itu bisa hilang — misalnya saat file dipindah lewat media yang tidak menyimpan permission — dan shell akan menolak dengan pesan yang cukup gamblang:

text
bash: ./salam-argumen: Permission denied

Perbaikannya satu perintah, chmod +x salam-argumen, yang menambahkan kembali huruf x. Untuk file hasil kompilasi kita biasanya tidak pernah perlu; chmod menjadi penting saat Anda menjalankan script shell atau binary hasil unduhan. Catatan tambahan yang menghubungkan ke Chapter sebelumnya: bila Anda mencoba menjalankan file yang tidak punya izin eksekusi, shell melapor dengan exit code 126 — angka khusus untuk “ditemukan, tetapi tidak boleh dijalankan”.

Exit Code dari Sisi Shell #

Chapter Kompilasi Program menunjukkan exit code milik compiler; kini kita baca exit code milik program sendiri. Nilai kembalian main() diteruskan ke shell dan tersimpan di variabel khusus $?:

bash
./salam-argumen Budi
echo $?
text
Terima kasih Budi!
0

Bandingkan dengan program yang sama tanpa argumen — nanti kita lihat kodenya mengembalikan 1 pada jalur itu:

bash
./salam-argumen
echo $?
text
Pemakaian: ./salam-argumen nama [sapaan lain]
1

Konvensi 0 = sukses dan selain nol = gagal membuat shell bisa menyusun keputusan: perintah ./a && ./b hanya menjalankan b bila a selesai dengan exit code 0. Skrip build, CI, dan bahkan IDE memakai mekanisme yang sama untuk menilai apakah langkah uji Anda lulus.

Meneruskan Argumen ke Program #

Program berikut adalah sisi penerima dari semua demo di atas. Ia membaca argc dan argv — parameter kedua bentuk main() yang kita kenalkan pada Chapter Struktur Program C++ — lalu menyusun kalimat dari argumen yang diteruskan pengguna:

cpp
#include <iostream>

int main(int argc, char* argv[]) {
    if (argc < 2) {
        std::cout << "Pemakaian: ./salam-argumen nama [sapaan lain]\n";
        return 1;
    }
    std::cout << "Terima kasih";
    for (int i = 1; i < argc; ++i) {
        std::cout << " " << argv[i];
    }
    std::cout << "!\n";
    return 0;
}

Output yang Dihasilkan:

text
Terima kasih Budi!

Program yang sama bila dijalankan tanpa argumen jatuh ke jalur pemakaian (blok berikut adalah file yang sama persis, kali ini dijalankan tanpa argumen):

cpp
#include <iostream>

int main(int argc, char* argv[]) {
    if (argc < 2) {
        std::cout << "Pemakaian: ./salam-argumen nama [sapaan lain]\n";
        return 1;
    }
    std::cout << "Terima kasih";
    for (int i = 1; i < argc; ++i) {
        std::cout << " " << argv[i];
    }
    std::cout << "!\n";
    return 0;
}

Output yang Dihasilkan:

text
Pemakaian: ./salam-argumen nama [sapaan lain]

Mari kita bedah mekanismenya:

  1. Baris 3 (int argc, char* argv[]): argc (argument count) adalah jumlah kata pada baris perintah, termasuk nama programnya sendiri; argv (argument vector) adalah array teks berisi kata-kata itu.
  2. Baris 4-7 (if (argc < 2)): bila tidak ada argumen pengguna, argc bernilai 1 (hanya nama program) — program mencetak cara pemakaian dan kembali dengan exit code 1 sebagai tanda gagal.
  3. Baris 9 (std::cout << "Terima kasih"): kata pertama kalimat dicetak tanpa spasi di depan, karena spasi pemisah ditangani loop berikutnya.
  4. Baris 10-12 (for): loop mulai dari indeks 1, bukan 0, karena argv[0] berisi nama program — di jalur ini namanya ./salam-argumen dan tidak perlu ikut tercetak.
  5. Baris 14 (return 0): jalur sukses dilaporkan dengan 0; jalur gagal baris 7 memakai 1, dan keduanya inilah yang kita baca lewat $? di shell.

Dua hal penting dari argv: semua argumen masuk sebagai teks — "27" bukan angka 27, dan konversinya perlu langkah eksplisit yang akan kita pelajari pada Chapter Input dengan cin — dan argumen yang mengandung spasi harus dibungkus tanda kutip di shell, misalnya ./salam-argumen "Dewi Anggraini", agar shell tidak memecahnya menjadi dua kata terpisah.

Dengan ini seluruh siklus hidup program sudah kita kuasai: menulis, mengompilasi, menjalankan, membaca statusnya. Tinggal satu keputusan konfigurasi yang menentukan fitur apa saja yang boleh kita pakai saat menulis — versi standar bahasanya. Chapter penutup Section ini membahas flag -std, perbedaan mode ISO dan mode GNU, serta rekomendasi pilihan standar untuk proyek baru.