Bab 12 menutup Bagian 1 series ini dengan fondasi lengkap Bash scripting, mulai dari variabel, percabangan, perulangan, fungsi, sampai menangani argumen script. Bagian 2 dimulai dari sini dengan arah yang lebih konkret: menerapkan seluruh fondasi itu untuk otomatisasi tugas harian di desktop atau laptop pribadi. User yang terbiasa mengetik perintah yang sama berulang kali, entah untuk merapikan nama file, mencadangkan folder penting, atau membereskan folder Downloads yang penuh sesak, sebenarnya sedang melakukan pekerjaan yang pas dilimpahkan ke sebuah script. Bab ini membahas empat kasus otomatisasi paling umum dibutuhkan User sehari-hari: rename file massal berdasarkan pola, backup folder penting secara otomatis lewat rsync dan tar, organisasi file otomatis berdasarkan jenisnya, dan penutup berupa alias serta shell function di .bashrc/.bash_profile supaya perintah-perintah favorit kita tidak perlu diketik ulang dari awal setiap membuka terminal baru.
13.1 Rename File Massal Berdasarkan Pola
Sub-bab ini membahas cara mengganti nama banyak file sekaligus berdasarkan satu pola yang konsisten, tanpa perlu mengklik dan mengetik ulang nama satu per satu lewat file manager.
13.1.1 Skenario dan Risiko Rename Massal
Skenario yang sangat umum ditemui: ratusan foto hasil pindah dari kamera atau HP masih bernama IMG_2044.JPEG, IMG_2045.jpeg, dengan ekstensi yang tidak konsisten huruf besar-kecilnya, atau butuh tambahan awalan tanggal supaya gampang diurutkan. Bash sendiri tidak punya perintah rename massal bawaan, jadi pendekatan paling portable adalah menggabungkan for loop (Bab 7.1) dengan mv (Bab 2.2.4) satu per satu di dalam loop. Beberapa distro memang menyediakan tool tambahan bernama rename, tapi sintaksnya berbeda-beda antar implementasi (versi berbasis Perl dan versi bawaan util-linux punya cara pakai yang tidak sama persis), sehingga series ini sengaja tidak bergantung padanya dan tetap memakai kombinasi for dan mv yang pasti bekerja di Bash versi mana pun.
Rename massal juga menyimpan risiko nyata yang wajib dipahami sebelum dipraktikkan: mv secara default menimpa file tujuan tanpa konfirmasi apa pun kalau nama hasil rename kebetulan sudah ada. Tidak ada "keranjang sampah" atau undo bawaan di level shell untuk membatalkan proses ini. Kebiasaan yang aman, dan akan dipraktikkan di 13.1.4, adalah selalu menguji dulu skrip rename dengan mode simulasi sebelum benar-benar mengeksekusinya ke file asli.
13.1.2 Rename dengan For Loop dan Parameter Expansion
Kasus paling sederhana adalah menyeragamkan ekstensi file, misalnya mengubah semua .jpeg menjadi .jpg. Bab 12.3.3 sudah memperkenalkan ${var#pola} untuk memotong bagian depan sebuah string. Kebutuhan kali ini justru sebaliknya, memotong bagian belakang string, memakai operator pasangannya, ${var%pola}.
#!/bin/bash
for file in *.jpeg; do
[[ -f "$file" ]] || continue
mv -- "$file" "${file%.jpeg}.jpg"
done${file%.jpeg} menghapus kemunculan .jpeg paling pendek yang cocok di akhir nilai file, menyisakan nama file tanpa ekstensinya, lalu .jpg baru ditempelkan di belakangnya. Baris [[ -f "$file" ]] || continue memakai operator pengujian file dari Bab 6.2.3 dan continue dari Bab 7.3.2, sengaja ditambahkan sebagai jaring pengaman kalau-kalau pola *.jpeg tidak menemukan satu pun file yang cocok, kondisi yang sudah dibahas sebagai jebakan glob tanpa match di Bab 7.1.5. Tanda -- sebelum "$file" memberi tahu mv bahwa argumen sesudahnya bukan opsi, berguna kalau kebetulan ada nama file yang diawali tanda hubung.
Untuk kebutuhan yang lebih agresif, dua variasi tambahan ${var##pola} dan ${var%%pola} layak diketahui. Bedanya dengan #/% tunggal ada pada keserakahan pencocokan: #/% tunggal memotong kecocokan terpendek, sedangkan ##/%% ganda memotong kecocokan terpanjang yang mungkin. Tabel berikut merangkum keempat variasinya.
| Sintaks | Memotong dari | Kecocokan |
|---|---|---|
${var#pola} | Depan (awal string) | Terpendek |
${var##pola} | Depan (awal string) | Terpanjang |
${var%pola} | Belakang (akhir string) | Terpendek |
${var%%pola} | Belakang (akhir string) | Terpanjang |
Selisih keempatnya baru benar-benar terasa saat pola memakai wildcard * dan string punya lebih dari satu kemungkinan titik cocok, misalnya file bernama laporan.data.tar.gz yang punya dua titik sekaligus.
nama="laporan.data.tar.gz"
echo "${nama%.*}"
echo "${nama%%.*}"${nama%.*} menghasilkan laporan.data.tar, karena tanda % tunggal hanya memotong kecocokan terpendek dari belakang, yaitu .gz saja. ${nama%%.*} menghasilkan laporan, karena %% yang serakah memotong sejauh mungkin dari belakang, menyisakan hanya bagian sebelum titik pertama. Perbedaan ini penting diingat saat menangani file berekstensi ganda seperti .tar.gz, dan akan dipakai lagi saat mengekstrak ekstensi file di 13.3.2.
13.1.3 Rename Pola Kompleks dengan sed
Parameter expansion di 13.1.2 sudah cukup untuk pola sederhana, tapi begitu kebutuhannya melibatkan regex sesungguhnya, seperti merapikan spasi ganda atau karakter aneh di nama file, sed dari Bab 10 jauh lebih tepat dipakai, mengingat pola di parameter expansion Bash sebenarnya glob, bukan regex, seperti sudah ditegaskan di Bab 9.4.5.
#!/bin/bash
for file in *.txt; do
[[ -f "$file" ]] || continue
nama_baru=$(echo "$file" | sed -E 's/[[:space:]]+/_/g')
mv -n -- "$file" "$nama_baru"
donePola [[:space:]]+ di atas menggabungkan character class POSIX dari Bab 9.3.2 dengan metakarakter + (satu atau lebih), yang menurut Bab 9.3.3 baru aktif sebagai metakarakter tanpa backslash begitu opsi -E dipakai. Perintah sed di sini dipakai sebagai pengubah string murni lewat pipe (Bab 5.3.5), bukan mengedit isi file secara in-place seperti opsi -i di Bab 10.3.1, karena yang diproses adalah nama file itu sendiri, bukan isinya. Kalau script ini nanti perlu tetap jalan di Bash bawaan macOS sebelum diperbarui lewat Homebrew (Bab 1.3.2), perlu diingat catatan GNU sed vs BSD sed di Bab 10.3.2: pola -E di atas tetap didukung kedua varian, tapi selalu uji dulu di sistem targetnya sebelum diandalkan penuh.
Kebutuhan lain yang sering muncul berdampingan, menambahkan awalan tanggal ke nama file, tidak perlu sed sama sekali, cukup command substitution (Bab 3.4.4) dari date.
prefix="$(date +%Y%m%d)_"
mv -n -- "$file" "${prefix}${file}"13.1.4 Verifikasi dengan Dry-Run Sebelum Eksekusi
Kebiasaan paling penting sebelum menjalankan rename massal ke file asli adalah menguji dulu hasilnya lewat mode simulasi, sering disebut dry-run: menjalankan logika yang sama tapi hanya menampilkan apa yang akan terjadi, tanpa benar-benar mengeksekusi perubahan. Teknik paling sederhana untuk dry-run di script buatan sendiri adalah mengganti sementara perintah mv dengan echo.
for file in *.jpeg; do
[[ -f "$file" ]] || continue
echo "mv -- '$file' '${file%.jpeg}.jpg'"
doneJalankan dulu versi echo ini, periksa satu per satu baris yang tercetak, baru ganti echo kembali menjadi mv begitu hasilnya sudah sesuai harapan. Sebagai lapisan pertahanan tambahan, opsi -n (--no-clobber) pada mv mencegah penimpaan file yang sudah ada di nama tujuan, sementara -i (--interactive) meminta konfirmasi setiap kali penimpaan berpotensi terjadi, sesuai dokumentasi resmi mv. Menambahkan salah satunya di script produksi jauh lebih aman dibanding mengandalkan asumsi bahwa pola rename yang dibuat pasti tidak akan pernah bentrok nama, seperti yang sudah dipakai di contoh 13.1.3.
Verifikasi akhir paling gampang cukup dengan ls (Bab 2.2.2) setelah proses selesai, memastikan jumlah file dan pola nama barunya sudah sesuai ekspektasi. Kalau ternyata ada nama yang salah pola sebelum sempat menimpa file penting, kembalikan dulu file yang salah rename secara manual, baru revisi bagian pola di script sebelum dicoba ulang.
13.2 Backup Folder Penting Secara Otomatis
Sub-bab ini membahas dua tool utama untuk mencadangkan folder penting di desktop/laptop secara otomatis lewat script: rsync untuk sinkronisasi, dan tar untuk membuat satu arsip terkompresi. Kedua tool ini dibahas lebih dalam lagi untuk konteks server di Bab 21, termasuk transfer lewat SSH dan strategi rotasi yang lebih matang; pembahasan di sini fokus ke kebutuhan backup lokal sehari-hari.
13.2.1 rsync vs tar: Memilih Strategi Backup
rsync adalah tool sinkronisasi file: ia menyalin folder sumber ke folder tujuan, dan pada eksekusi berikutnya hanya menyalin ulang bagian yang berubah saja, membuatnya jauh lebih cepat untuk backup rutin dibanding menyalin ulang semua file dari nol setiap kali. tar (tape archive) bekerja dengan cara berbeda: ia mengemas seluruh isi folder menjadi satu file arsip tunggal, biasa dikompresi sekaligus lewat gzip, menghasilkan satu snapshot mandiri yang mudah dipindahkan atau disimpan di lokasi lain seperti hard disk eksternal atau layanan penyimpanan cloud.
| Aspek | rsync | tar |
|---|---|---|
| Output | Folder tujuan berisi salinan struktur file apa adanya | Satu file arsip tunggal (.tar atau .tar.gz) |
| Backup berikutnya | Hanya menyalin ulang bagian yang berubah | Membuat arsip baru dari awal setiap kali dijalankan |
| Paling cocok untuk | Backup rutin dengan folder sumber besar dan jarang berubah total | Snapshot titik waktu tertentu, gampang diarsipkan/dipindahkan |
13.2.2 Sinkronisasi Folder dengan rsync
Bentuk paling dasar rsync untuk backup lokal menyalin isi satu folder ke folder lain.
rsync -av ~/Dokumen/ ~/Backup/Dokumen/Opsi -a (archive mode) adalah opsi paling penting untuk kebutuhan backup, karena menurut dokumentasi resmi rsync setara dengan gabungan opsi -rlptgoD: rekursif ke seluruh subfolder, menyalin symbolic link apa adanya (bukan file aslinya), serta mempertahankan permission, timestamp, group, dan owner file sesuai aslinya. Perlu jujur dicatat, -a secara default tidak menyertakan ACL maupun extended attribute (butuh opsi tambahan -A dan -X terpisah kalau memang dibutuhkan) dan tidak mempertahankan hard link (butuh -H terpisah), jadi jangan berasumsi -a saja sudah mencakup semuanya untuk kebutuhan backup yang sangat ketat. Opsi -v (verbose) menampilkan detail file apa saja yang sedang disalin, berguna untuk memantau proses backup secara langsung.
Tanda garis miring di akhir path folder sumber, seperti pada ~/Dokumen/ di atas, punya arti penting menurut dokumentasi resmi rsync: garis miring itu membuat isi folder Dokumen disalin langsung ke dalam ~/Backup/Dokumen/, bukan menyalin folder Dokumen itu sendiri sebagai subfolder baru di dalam tujuan. Menghilangkan garis miring di belakang path sumber (rsync -av ~/Dokumen ~/Backup/) tetap menghasilkan struktur akhir ~/Backup/Dokumen/ juga, tapi kali ini karena folder Dokumen ikut disalin sebagai satu kesatuan ke dalam ~/Backup/. Kebiasaan yang aman adalah selalu eksplisit menuliskan garis miring di akhir path folder sumber maupun tujuan, supaya hasilnya konsisten dan gampang diprediksi.
Untuk backup yang benar-benar mencerminkan kondisi sumber saat ini, termasuk menghapus file di tujuan yang sudah tidak ada lagi di sumber, tambahkan opsi --delete.
rsync -av --delete ~/Dokumen/ ~/Backup/Dokumen/Opsi --delete ini tergolong berisiko: dokumentasi resmi rsync secara eksplisit menyarankan mencobanya lebih dulu dengan opsi --dry-run (atau -n) sebelum dijalankan sungguhan, supaya kita tahu persis file apa saja yang akan terhapus di folder tujuan sebelum benar-benar kehilangan file itu.
rsync -av --delete --dry-run ~/Dokumen/ ~/Backup/Dokumen/13.2.3 Arsip Terkompresi dengan tar
Untuk kebutuhan snapshot sekali jalan, misalnya sebelum melakukan perubahan besar ke sebuah folder proyek, arsip tar terkompresi lebih praktis dibanding sinkronisasi rsync. Kombinasikan dengan date lewat command substitution (Bab 3.4.4) supaya tiap arsip punya nama unik berdasarkan tanggal pembuatannya.
#!/bin/bash
tanggal="$(date +%Y%m%d-%H%M)"
tar -czf ~/Backup/dokumen-"$tanggal".tar.gz -C ~/ DokumenOpsi -c membuat arsip baru, -z mengompresnya lewat gzip, dan -f menentukan nama file arsip yang dihasilkan. Opsi -C ~/ (huruf besar) membuat tar berpindah direktori kerja ke ~/ lebih dulu sebelum mengarsipkan folder Dokumen, sehingga path yang tersimpan di dalam arsip relatif (Dokumen/...), bukan path absolut penuh seperti /home/user/Dokumen/.... Kebiasaan ini penting karena arsip berisi path relatif jauh lebih fleksibel diekstrak ulang ke lokasi mana pun, dibanding arsip berisi path absolut yang memaksa hasil ekstraknya selalu kembali ke lokasi yang sama persis.
13.2.4 Rotasi Backup dan Verifikasi Arsip
Script backup harian yang dijalankan terus-menerus tanpa pembersihan lama-lama memenuhi disk dengan arsip lama yang sudah tidak relevan. Tambahkan langkah rotasi: menghapus arsip yang sudah melewati usia tertentu, memakai find beserta opsi -mtime.
find ~/Backup/ -name "dokumen-*.tar.gz" -mtime +30 -deleteSesuai dokumentasi resmi GNU find, -mtime +30 mencocokkan file yang data-nya terakhir diubah lebih dari 30×24 jam yang lalu, dengan catatan pembulatan waktunya dihitung dalam kelipatan 24 jam. Opsi -delete di akhir bersifat destruktif dan permanen, jadi ganti dulu sementara dengan -print untuk melihat daftar file yang akan terhapus sebelum yakin memakai -delete sungguhan, pola dry-run yang sama seperti dibahas di 13.1.4 dan 13.2.2.
find ~/Backup/ -name "dokumen-*.tar.gz" -mtime +30 -printSetelah arsip dibuat, langkah verifikasi minimal yang wajib dibiasakan adalah memeriksa isinya bisa dibaca ulang tanpa error, bukan cuma memastikan ukurannya tidak nol.
tar -tzf ~/Backup/dokumen-"$tanggal".tar.gzOpsi -t menampilkan daftar isi arsip tanpa benar-benar mengekstraknya, cara cepat memastikan arsip tidak rusak sebelum benar-benar dibutuhkan di kemudian hari, momen yang biasanya sudah terlambat untuk menyadari arsip ternyata gagal dibuat dengan benar. Backup yang benar-benar berguna adalah backup yang berjalan rutin tanpa perlu diingat-ingat setiap hari; menjadwalkan script rsync maupun tar di atas supaya berjalan otomatis lewat cron dibahas di Bab 15.1.
13.3 Organisasi File Otomatis
Sub-bab ini membahas cara mengelompokkan file secara otomatis berdasarkan jenisnya, studi kasus yang sangat relevan untuk folder Downloads yang jadi tempat singgah sementara hampir semua file yang diunduh User dari internet.
13.3.1 Skenario: Folder Downloads yang Berantakan
Folder Downloads di banyak laptop User jadi tempat sampah universal: installer .deb, gambar .png, dokumen .pdf, dan arsip .zip semua bercampur tanpa urutan. Merapikannya manual setiap minggu cepat terasa membosankan, padahal polanya sangat berulang: file dengan ekstensi tertentu selalu berakhir di folder tertentu. Pola berulang seperti ini persis kandidat ideal untuk diotomatisasi lewat script, alih-alih dikerjakan manual berkali-kali.
13.3.2 Mengelompokkan File Berdasarkan Ekstensi
Associative array dari Bab 4.2 pas dipakai untuk memetakan ekstensi ke nama folder tujuan, supaya menambah aturan baru cukup menambah satu baris tanpa mengubah logika loop-nya sama sekali, sama seperti prinsip yang sudah dibahas di studi kasus Bab 4.4.3.
#!/bin/bash
sumber="$HOME/Downloads"
declare -A folder_tujuan=(
["pdf"]="Dokumen"
["docx"]="Dokumen"
["jpg"]="Gambar"
["png"]="Gambar"
["zip"]="Arsip"
["tar"]="Arsip"
["gz"]="Arsip"
)
for file in "$sumber"/*; do
[[ -f "$file" ]] || continue
nama_file=$(basename "$file")
ekstensi="${nama_file##*.}"
ekstensi="${ekstensi,,}"
tujuan="${folder_tujuan[$ekstensi]:-Lainnya}"
mkdir -p "$sumber/$tujuan"
mv -n -- "$file" "$sumber/$tujuan/"
done${nama_file##*.} memakai bentuk serakah dari 13.1.2 untuk mengambil ekstensi setelah titik terakhir, konsisten dengan contoh laporan.data.tar.gz sebelumnya, supaya file seperti arsip.tar.gz tetap terbaca ekstensinya sebagai gz, bukan tar.gz. Baris ekstensi="${ekstensi,,}" menormalkan huruf ekstensi jadi kecil semua lewat case conversion dari Bab 9.4.4, supaya .PDF dan .pdf dikenali sebagai ekstensi yang sama. Sintaks ${folder_tujuan[$ekstensi]:-Lainnya} menggabungkan akses associative array dari Bab 4.2.3 dengan nilai default yang sudah disinggung di Bab 6.4.4: kalau ekstensi file tidak terdaftar di folder_tujuan, file tetap diproses, ditempatkan ke folder Lainnya, alih-alih bikin script berhenti atau mengembalikan string kosong. mkdir -p dari Bab 2.2.3 memastikan folder tujuan otomatis dibuat kalau belum ada, tanpa memicu error kalau ternyata folder itu sudah ada sebelumnya.
Beri izin eksekusi lebih dulu sesuai kebiasaan di Bab 1.4.3, lalu jalankan script dan verifikasi hasilnya lewat ls (Bab 2.2.2) di tiap folder tujuan.
chmod +x rapikan-downloads.sh
./rapikan-downloads.sh
ls ~/Downloads/Dokumen ~/Downloads/Gambar ~/Downloads/ArsipKalau ingin proses ini berjalan otomatis tanpa perlu diingat-ingat, misalnya sekali sehari, script ini tinggal dijadwalkan lewat cron, teknik penjadwalan untuk User yang dibahas di Bab 15.1 dan diperdalam lagi untuk kebutuhan server di Bab 18.
13.3.3 Troubleshooting: File Tanpa Ekstensi dan Nama Bentrok
Dua jebakan wajib diantisipasi sebelum script ini dijalankan rutin di folder Downloads sungguhan. Pertama, file yang sama sekali tidak punya ekstensi, misalnya file bernama README tanpa titik sama sekali. Karena pola *. di dalam ${nama_file##*.} tidak ditemukan, hasilnya adalah nama_file itu sendiri apa adanya, bukan string kosong, sehingga README berakhir dianggap sebagai "ekstensi" readme dan masuk ke folder Lainnya lewat nilai default. Perilaku ini aman untuk kasus di atas, tapi tetap perlu disadari supaya tidak salah menduga script sedang gagal.
Kedua, dan lebih berisiko, adalah nama file yang sudah ada persis sama di folder tujuan. Script di 13.3.2 sengaja memakai mv -n dari 13.1.4, bukan mv polos, supaya file dengan nama sama di tujuan tidak tertimpa begitu saja. Konsekuensinya, file sumber yang gagal dipindah karena nama bentrok akan tetap tertinggal di folder Downloads asalnya, bukan hilang atau tertimpa diam-diam. Kalau kebutuhannya justru ingin menyimpan kedua file dengan nama yang dibedakan otomatis, tambahkan timestamp ke nama file sebelum dipindah, teknik yang sama seperti dipakai untuk penamaan arsip di 13.2.3.
13.4 Alias dan Shell Function di .bashrc/.bash_profile
Sub-bab penutup ini membahas cara menyimpan perintah favorit kita secara permanen supaya langsung tersedia setiap kali membuka terminal baru, tanpa perlu menuliskannya ulang atau menjalankan script terpisah dari awal.
13.4.1 Alias vs Shell Function: Kapan Pakai yang Mana
Alias adalah singkatan sederhana yang menggantikan satu perintah panjang, atau kombinasi perintah, dengan nama pendek yang gampang diingat, dibuat lewat builtin alias.
alias ll='ls -la'
alias update='sudo apt update && sudo apt upgrade'Alias update di atas memakai apt, package manager khas distro berbasis Debian seperti Ubuntu. Distro lain punya package manager dan sintaksnya sendiri, misalnya dnf di Fedora atau pacman di Arch Linux, jadi sesuaikan isi alias ini dengan package manager yang benar-benar terpasang di sistem kita sebelum dipakai.
Alias murni substitusi teks, diproses sebelum shell menjalankan baris perintah lebih lanjut, sehingga tidak bisa menerima argumen dengan posisi bebas atau memakai logika kondisi sama sekali. Begitu kebutuhannya melibatkan argumen ($1, $2 dari Bab 8.2), percabangan (Bab 6), atau lebih dari beberapa baris logika, shell function dari Bab 8.1 adalah pilihan yang lebih tepat, ditulis langsung di file konfigurasi shell alih-alih di dalam script terpisah.
mkcd() {
mkdir -p "$1" && cd "$1" || return 1
}Function mkcd di atas, singkatan informal dari make and change directory, membuat folder baru sekaligus langsung berpindah ke dalamnya, kombinasi dua perintah yang sering dilakukan berurutan tapi tidak bisa dibungkus jadi alias biasa karena butuh menerima argumen nama folder secara dinamis. Operator && dan || dari Bab 6.4.2 memastikan cd hanya dijalankan kalau mkdir -p berhasil, dan function keluar dengan status gagal kalau salah satu langkahnya gagal.
13.4.2 Membuat Alias dan Function Permanen
Alias maupun function yang diketik langsung di terminal hanya berumur selama sesi shell itu berjalan, hilang begitu terminal ditutup. Supaya permanen, keduanya perlu dituliskan di dalam file konfigurasi shell yang otomatis dibaca Bash setiap kali sesi baru dimulai. Dokumentasi resmi Bash membedakan dua file utama untuk ini, tergantung jenis sesi shell yang dijalankan: login shell membaca ~/.bash_profile (atau ~/.bash_login, lalu ~/.profile, dipakai yang pertama ditemukan), sedangkan interactive shell yang bukan login shell membaca ~/.bashrc.
Perbedaan ini kadang membingungkan karena beda perilakunya antar aplikasi terminal: sebagian besar terminal emulator di Linux membuka sesi interactive non-login yang hanya membaca .bashrc, sedangkan aplikasi Terminal bawaan macOS secara konsisten selalu membuka setiap jendela barunya sebagai login shell, sehingga hanya .bash_profile yang otomatis terbaca kecuali polanya disatukan seperti di bawah ini. Supaya alias dan function yang kita tulis konsisten muncul di kedua jenis sesi tanpa perlu menulis dua kali, kebiasaan yang lazim dipakai adalah membuat .bash_profile ikut memuat .bashrc.
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fiBaris . ~/.bashrc (titik diikuti spasi lalu path) adalah bentuk singkat perintah source, membaca dan menjalankan isi file itu di dalam sesi shell yang aktif saat ini, bukan menjalankannya sebagai proses baru terpisah. Pola ini membuat kita cukup menaruh seluruh alias dan function di .bashrc saja, dan baris di atas memastikan isinya tetap ikut terbaca meski sesi yang dibuka kebetulan login shell.
echo "alias ll='ls -la'" >> ~/.bashrcPerintah echo ... >> di atas menambahkan baris baru ke akhir .bashrc lewat append redirection dari Bab 5.3.1, cara cepat menambah satu-dua alias dari terminal, meski untuk banyak alias sekaligus mengedit file konfigurasinya langsung lewat teks editor jauh lebih gampang dibaca ulang.
13.4.3 Shell Function untuk Logika Lebih Kompleks
Function yang ditaruh di .bashrc memakai sintaks persis sama seperti function di dalam script biasa, termasuk local variable dari Bab 8.4.2. Contoh berikut membuat function backup-cepat yang membungkus perintah tar dari 13.2.3 supaya bisa dipanggil langsung dari direktori mana pun.
backup-cepat() {
local target="$1"
local tanggal
if [[ -z "$target" ]]; then
echo "Penggunaan: backup-cepat NAMA_FOLDER" >&2
return 1
fi
tanggal="$(date +%Y%m%d-%H%M)"
tar -czf ~/Backup/"$(basename "$target")"-"$tanggal".tar.gz \
-C "$(dirname "$target")" "$(basename "$target")"
echo "Backup selesai: $target"
}Variabel local memastikan target dan tanggal tidak membocori atau menimpa variabel lain bernama sama di sesi shell interaktif kita, konsisten dengan alasan pemakaian local di dalam function yang sudah dibahas di Bab 8.4.2. Setelah menaruh function ini di .bashrc, jalankan source ~/.bashrc atau buka terminal baru, lalu function langsung bisa dipanggil seperti perintah biasa, misalnya backup-cepat ~/Dokumen.
13.4.4 Verifikasi dan Troubleshooting Alias Tidak Termuat
Setelah menambahkan alias atau function baru ke file konfigurasi, sesi shell yang sedang berjalan tidak otomatis mengetahuinya, karena file itu hanya dibaca sekali saat sesi dimulai. Muat ulang secara eksplisit lewat source, atau buka jendela terminal baru.
source ~/.bashrcBuiltin type adalah cara paling cepat memeriksa apakah sebuah nama sudah dikenali sebagai alias, function, atau perintah biasa, sekaligus membedakan ketiganya.
type ll
type mkcdKalau type tetap melaporkan "not found" padahal alias sudah ditambahkan dan .bashrc sudah di-source ulang, penyebab paling umum di lapangan adalah alias itu ditulis di file yang salah untuk jenis sesi shell yang sedang aktif, persis jebakan login shell vs non-login shell yang dibahas di 13.4.2. Builtin shopt yang sudah disinggung sekilas di Bab 7.1.5 punya opsi login_shell khusus untuk memeriksa hal ini, nilainya diset otomatis oleh Bash sendiri saat sesi dimulai dan tidak bisa diubah manual.
shopt login_shellKalau hasilnya login_shell off, sesi yang sedang berjalan adalah interactive non-login shell, sehingga alias yang hanya ditulis di .bash_profile tanpa pola source ~/.bashrc dari 13.4.2 memang tidak akan pernah terbaca di sesi semacam ini. Untuk sementara menonaktifkan satu alias tanpa menghapusnya dari .bashrc, builtin unalias menghapusnya dari sesi yang sedang berjalan saja, tanpa menyentuh file konfigurasinya.
unalias llEmpat teknik di bab ini, rename massal, backup otomatis, organisasi file, dan alias/function permanen, adalah otomatisasi harian yang paling sering dibutuhkan User di desktop maupun laptop pribadi. Bab 14 melanjutkan arah yang sama dengan fokus lebih spesifik ke manajemen file multimedia, mulai dari konversi batch gambar dan video sampai kompresi arsip untuk koleksi media yang lebih besar.

