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”:
./salam-argumen DewiTerima 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:
bash: salam-argumen: command not foundAturan 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:
stat -c '%A %n' salam-argumen-rwxr-xr-x salam-argumenHuruf 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:
bash: ./salam-argumen: Permission deniedPerbaikannya 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 $?:
./salam-argumen Budi
echo $?Terima kasih Budi!
0Bandingkan dengan program yang sama tanpa argumen — nanti kita lihat kodenya mengembalikan 1 pada jalur itu:
./salam-argumen
echo $?Pemakaian: ./salam-argumen nama [sapaan lain]
1Konvensi 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:
#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:
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):
#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:
Pemakaian: ./salam-argumen nama [sapaan lain]Mari kita bedah mekanismenya:
- 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. - Baris 4-7 (
if (argc < 2)): bila tidak ada argumen pengguna,argcbernilai 1 (hanya nama program) — program mencetak cara pemakaian dan kembali dengan exit code1sebagai tanda gagal. - Baris 9 (
std::cout << "Terima kasih"): kata pertama kalimat dicetak tanpa spasi di depan, karena spasi pemisah ditangani loop berikutnya. - Baris 10-12 (
for): loop mulai dari indeks1, bukan0, karenaargv[0]berisi nama program — di jalur ini namanya./salam-argumendan tidak perlu ikut tercetak. - Baris 14 (
return 0): jalur sukses dilaporkan dengan0; jalur gagal baris 7 memakai1, 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.