Konfigurasi shell tersebar pada beberapa berkas tersembunyi di direktori home, dan menyalinnya antar mesin secara manual cepat menimbulkan salinan yang berbeda-beda. Topik ini membahas dotfiles, yaitu berkas konfigurasi yang namanya diawali titik, beserta isi paling umumnya seperti alias, fungsi, dan prompt. Bahasan ditutup dengan demo langsung sebuah berkas contoh di sandbox untuk mengelola seluruh berkas tersebut sebagai repository berversi.
Dotfiles dan berkas konfigurasi shell#
Dotfiles adalah berkas konfigurasi yang namanya diawali tanda titik, misalnya .bashrc dan .gitconfig. Pada sistem Unix, berkas berawalan titik tidak ditampilkan oleh ls tanpa flag, sehingga direktori home tampak bersih sementara konfigurasinya tetap lengkap. Flag ls -a menampilkannya kembali.
Bash pada sesi interaktif membaca ~/.bashrc ketika sesi dimulai, sedangkan zsh membaca ~/.zshrc. Isi berkas itu dieksekusi baris demi baris seolah-olah diketik di prompt, sehingga definisi alias, fungsi, dan variabel yang ditulis di sana langsung berlaku pada setiap sesi baru. Berkas inilah tempat dotfiles bekerja, dan karena berkasnya dieksekusi shell, kaidah bahasanya sama dengan kaidah skrip.
Alias untuk singkatan perintah#
Alias adalah nama pendek yang dipetakan ke perintah yang lebih panjang. Definisinya diletakkan di dotfiles agar tersedia pada setiap sesi interaktif:
# alias memetakan nama pendek ke perintah yang lebih panjang
alias ll='ls -alF'
alias grep='grep --color=auto'Alias ll melengkapi tampilan daftar direktori dengan atribut berkas dan tanda jenis, sedangkan grep mengaktifkan warna pada kecocokan. Dua batasan alias penting untuk diingat. Shell non-interaktif, termasuk sesi yang menjalankan skrip, tidak memperluas alias, sehingga alias tidak boleh diandalkan di dalam skrip. Alias juga tidak menerima argumen, sehingga pemetaan semacam alias gco='git checkout' tidak dapat menerima parameter tambahan. Kedua batasan itu membuat fungsi shell menjadi pilihan yang lebih andal untuk kebutuhan yang melampaui sekadar singkatan.
Fungsi shell yang lebih andal#
Fungsi shell mengatasi kedua batasan alias. Fungsi menerima argumen melalui $1, $2, dan seterusnya, bekerja pada sesi interaktif maupun non-interaktif, dan sintaksnya sama di bash dan zsh. Definisi berikut menghitung banyaknya kata pada sebuah berkas teks:
# fungsi menerima argumen seperti perintah biasa
hitung_kata() {
wc -w < "$1"
}Pemanggilannya persis seperti pemanggilan perintah, misalnya hitung_kata catatan.txt mengirim nama berkas sebagai argumen pertama. Karena sifatnya portabel, fungsi menjadi inti dotfiles yang disusun dengan sungguh-sungguh, sedangkan alias dipakai hanya untuk singkatan murni. Pemisahan ini juga membuat dotfiles lebih mudah diaudit karena setiap perilaku muncul di satu tempat dengan nama yang jelas.
Struktur repository dotfiles#
Repository adalah direktori proyek yang seluruh perubahannya dilacak oleh version control, yaitu sistem pencatat riwayat perubahan seperti git. Dotfiles yang dikelola sebagai repository berada di satu direktori khusus, misalnya ~/dotfiles, sedangkan berkas aslinya di home menjadi symlink (tautan simbolis, yaitu berkas yang menunjuk berkas lain) ke lokasi di dalam repository.
dotfiles/
├── README.md
├── install.sh
├── bash/
│ ├── bashrc
│ └── profile
├── git/
│ └── gitconfig
└── vim/
└── vimrcDengan struktur tersebut, ~/.bashrc menjadi symlink yang menunjuk ~/dotfiles/bash/bashrc. Setiap perubahan konfigurasi tercatat sebagai commit beserta pesannya, sehingga perubahan yang merusak dapat dilacak dan dikembalikan. Memindahkan konfigurasi ke mesin baru cukup dilakukan dengan menggandakan repository melalui git clone, menjalankan install.sh yang membuat symlink, dan membuka sesi shell baru. Berkas README.md mencatat alat yang menjadi prasyarat beserta langkah instalasinya.
Mencoba contoh dotfiles di sandbox#
Berkas berikut adalah kerangka dotfiles yang dipakai sebagai aset topik. Alias ditulis disertai komentar penjelasan karena hanya berpengaruh pada sesi interaktif, sedangkan fungsinya dapat didemokan langsung:
# bashrc-contoh: kerangka dotfiles untuk sesi bash
# alias hanya berpengaruh pada sesi interaktif
alias ll='ls -alF'
alias grep='grep --color=auto'
# fungsi penghitung kata pada sebuah berkas teks
hitung_kata() {
wc -w < "$1"
}
# fungsi pembuat arsip cadangan sederhana
cadangkan() {
cp "$1" "$1.cadangan"
echo "cadangan dibuat: $1.cadangan"
}
# prompt untuk sesi interaktif
PS1='\w\$ 'Berkas contoh dimuat ke sesi shell sekarang dengan perintah source, lalu fungsinya dipanggil pada berkas catatan yang baru dibuat:
# memuat berkas contoh ke dalam sesi shell
source bashrc-contoh# membuat berkas catatan lalu memanggil fungsi dari dotfiles
printf '%s\n' "pembaruan shell" "alias dan fungsi" "prompt dan repository" > catatan-baca.txt
hitung_kata catatan-baca.txt
cadangkan catatan-baca.txt
ls -18
cadangan dibuat: catatan-baca.txt.cadangan
bashrc-contoh
catatan-baca.txt
catatan-baca.txt.cadangan
index.mdFungsi hitung_kata mengirim isi berkas ke wc -w dan melaporkan delapan kata, sedangkan cadangkan menyalin berkas lalu mencetak konfirmasi. Keluaran ls -1 memperlihatkan berkas cadangan yang baru dibuat di samping berkas aslinya. Demo ini meniru alur dotfiles yang sebenarnya, yaitu memuat berkas konfigurasi ke sesi shell lalu memanggil isi konfigurasi tersebut.
Prompt PS1#
Variabel PS1 menentukan bentuk prompt, yaitu teks yang dicetak shell sebelum kursor pada sesi interaktif. Nilainya memakai urutan pelarian yang diperluas shell, antara lain \u untuk nama pengguna, \h untuk nama host, \w untuk direktori kerja, dan \$ untuk karakter perintah yang berbeda antara pengguna biasa dan root:
# PS1 menentukan bentuk prompt sesi interaktif
PS1='\w\$ '~/proyek$Prompt pada contoh di atas hanya menampilkan direktori kerja dan karakter perintah. Sesi verifikasi di sandbox bersifat non-interaktif, sehingga PS1 tidak berpengaruh pada tampilan apa pun. Bentuknya karena itu diperlihatkan sebagai ilustrasi konfigurasi yang siap dipakai. Penyimpanan prompt di dotfiles seperti aset bashrc-contoh menjaga bentuknya tetap konsisten di setiap mesin yang memuat repository.
Kesalahan umum#
- Perintah yang mencetak keluaran ditaruh di
.bashrc. Sesi non-interaktif pada mesin tujuan ikut membaca berkas tersebut saat penyalinan jarak jauh denganscpataursync, sehingga teks tambahan menyusup ke aliran data dan transfer menjadi rusak. Perbaikannya adalah menyimpan hanya definisi tanpa keluaran di.bashrc. - Seluruh konfigurasi ditumpuk di satu berkas besar tanpa repository. Perubahan lama sulit dilacak dan mesin baru tidak bisa disiapkan dengan cepat. Perbaikannya adalah memecah konfigurasi per perangkat lunak dan melacaknya sebagai repository berversi.
- Alias dipakai untuk kebutuhan yang membutuhkan argumen. Shell non-interaktif tidak memperluas alias dan alias tidak menerima parameter, sehingga perilakunya sulit diprediksi. Perbaikannya adalah menggantinya dengan fungsi shell.
Ringkasan#
- Dotfiles adalah berkas konfigurasi berawalan titik yang dieksekusi shell sesi interaktif ketika sesi dimulai.
- Alias memetakan singkatan pada sesi interaktif, sedangkan fungsi menerima argumen dan bekerja juga pada sesi non-interaktif.
- Prompt PS1 membentuk teks sesi interaktif dan dikonfigurasi dengan urutan pelarian seperti
\wdan\$. - Mengelola dotfiles sebagai repository berversi membuat konfigurasi tercatat, dapat dikembalikan, dan mudah dipindahkan melalui symlink.
Referensi#
- GNU Bash Reference Manual — Free Software Foundation — Dokumentasi berkas startup bash, alias, fungsi, dan prompt PS1.