Membongkar arsitektur Zsh dari dalam: shell yang dibangun di atas bahasa C dengan mode interaktif vs non-interaktif, lima startup files yang dibaca sesuai urutan (zshenv, zprofile, zshrc, zlogin, zlogout), serta komponen inti seperti ZLE (Zsh Line Editor), completion system, dan modul yang bisa dimuat dengan zmodload

Setelah di episode 1 kita memahami sejarah dan alasan mengapa Zsh layak dipelajari, pada episode ini kita membedah arsitektur Zsh dari dalam. Ini penting karena hampir semua masalah yang kalian temui di lapangan — kenapa .zshrc tidak terbaca di cron, kenapa environment tidak ter-set saat SSH masuk, kenapa prompt berbeda di terminal vs skrip — berakar pada arsitektur ini.
Zsh adalah program yang kompleks, tetapi struktur konsepnya bisa dipecah menjadi tiga lapisan: mode eksekusi (interaktif vs non-interaktif), startup files (urutan inisialisasi), dan komponen inti (ZLE, completion, modul). Pahami tiga lapisan ini, dan kalian akan bisa mendiagnosis hampir semua perilaku aneh Zsh.
Zsh ditulis dalam bahasa C, sama seperti bash. Ini berarti ia cepat, ringan, dan tersedia di hampir semua platform Unix-like. Karena dibangun sebagai program native, setiap fiturnya — parser, globbing engine, line editor, completion — adalah kode C yang dikompilasi, bukan skrip yang diinterpretasi.
Dampak praktisnya: Zsh bisa memproses skrip puluhan ribu baris dengan cepat, dan startup-nya bisa dijaga di bawah 100 ms jika dikonfigurasi benar (kita optimalkan ini di episode 21). Arsitektur berbasis C ini juga memungkinkan modul — fitur opsional yang dimuat hanya saat dibutuhkan lewat zmodload.
Konsep paling mendasar: Zsh berjalan dalam dua mode yang sangat berbeda perilakunya.
| Mode | Karakteristik | Contoh |
|---|---|---|
| Interaktif | Membaca perintah dari keyboard, menampilkan prompt, punya ZLE, completion aktif | Terminal yang kalian buka setiap hari |
| Non-interaktif | Membaca skrip dari file/pipe, tanpa prompt, tanpa ZLE | zsh script.zsh, skrip cron, zsh -c "echo hi" |
Perbedaan ini penting karena startup files yang dibaca berbeda untuk tiap mode. Skrip non-interaktif tidak membaca .zshrc — inilah mengapa helper yang mengandalkan alias yang didefinisikan di .zshrc sering gagal saat dijalankan dari cron. Aturan praktisnya:
zshenv → zprofile → zshrc → zlogin.zshenv → zshrc.zshenv (jika bukan sh-mode).# Dari dalam terminal (interaktif)
[[ -o interactive ]] && echo "interactive"
echo $0 # tampilkan nama shellZsh memiliki lima startup files. Memahami perbedaan mereka adalah kunci konfigurasi yang benar:
| File | Kapan Dibaca | Untuk Apa |
|---|---|---|
zshenv | Selalu (semua mode) | Environment variable yang harus ada di mana-mana |
zprofile | Login shell, sebelum zshrc | Perintah sekali saat login (misal startx) |
zshrc | Setiap shell interaktif | Alias, prompt, completion, keybinding |
zlogin | Login shell, setelah zshrc | Perintah yang butuh shell siap dulu |
zlogout | Saat keluar dari login shell | Pembersihan, log, clear |
Urutan baca untuk login shell: zshenv → zprofile → zshrc → zlogin. Perhatikan posisi zshrc — ia dibaca di tengah, sehingga bisa meng-override zprofile tetapi di-override oleh zlogin.
Tip
Aturan praktis yang dipakai banyak developer: simpan variabel environment di zshenv (agar ada di skrip), simpan pengaturan interaktif (alias, prompt, completion) di zshrc, dan jangan terlalu sering menyentuh zprofile/zlogin — kebanyakan orang hanya butuh zshrc + zshenv.
ZLE adalah sistem line editing Zsh — bagian yang menangani apa pun yang kalian ketik di prompt: keybinding, cursor movement, Ctrl-R history search, hingga widget. ZLE memisahkan dua mode editing: emacs (default) dan vi. Semua perilaku ini diatur lewat bindkey dan widget — kita bedah lengkap di episode 7.
Completion system Zsh adalah salah satu yang paling canggih di dunia shell. Ia berbasis function library yang diinisialisasi oleh compinit, memetakan perintah ke function penyedia completion (misalnya _git, _kubectl, _ssh), dan perilakunya dikustomisasi dengan zstyle. Inilah alasan utama banyak orang pindah ke Zsh — detailnya kita bahas di episode 6.
Zsh mendukung prompt yang sangat kaya: PROMPT (kiri), RPROMPT (kanan), PROMPT2 (lanjutan), plus prompt escapes untuk warna, informasi direktori, dan status git via vcs_info. Prompt ditulis sebagai string dengan escape sequence, bukan lewat program eksternal.
zmodload)Zsh memuat banyak fitur sebagai modul opsional agar tetap ringan. Beberapa yang sering dipakai:
zmodload zsh/datetime # variabel EPOCHSECONDS
zmodload zsh/mathfunc # fungsi matematika: sin, cos, ceil
zmodload zsh/complist # menu completion yang berwarna
zmodload zsh/regex # operator =~ untuk regexDengan zmodload, kalian hanya membayar (dalam bentuk memory dan startup time) untuk fitur yang benar-benar dipakai. Episode 15 akan membahas modul datetime dan mathfunc secara praktis.
zshenv selalu; zprofile/zshrc/zlogin untuk login; zshrc untuk interaktif.compinit + zstyle.zmodload.Inti yang harus dibawa pulang:
zshenv → zprofile → zshrc → zlogin, plus zlogout saat keluar.zmodload.Di episode 3 selanjutnya, kita mulai praktik sungguhan: instalasi Zsh dan Hello World — menginstall zsh 5.9.2 di berbagai distro, menjadikannya default dengan chsh, menulis skrip pertama script.zsh dengan shebang #!/usr/bin/env zsh, dan memahami cara kerja eksekusi skrip. Sampai jumpa di episode 3!