Bab 13 dan 14 sudah menunjukkan bagaimana Bash merapikan file, membuat backup, dan mengelola koleksi foto/video secara otomatis. Bab ini mengambil arah yang sedikit berbeda: bukan lagi soal mengolah file, tapi soal membuat rutinitas kerja User sehari-hari di desktop lebih ringkas. User yang sibuk berpindah antar banyak aplikasi sering lupa mencatat pengingat kecil, atau harus menyalin ulang konfigurasi favorit satu per satu begitu pindah ke laptop baru. Reminder yang muncul sendiri tanpa perlu diingat-ingat, potongan teks yang langsung tersalin ke clipboard tanpa mengetik ulang, sampai laptop baru yang siap pakai hanya dengan menjalankan satu script, semuanya kandidat pekerjaan yang pas dilimpahkan ke Bash. Bab ini membahas empat hal: reminder dan notifikasi sederhana lewat notify-send dan cron, integrasi dengan aplikasi desktop seperti clipboard dan screenshot, membangun "dotfiles" untuk menyimpan konfigurasi personal, dan ditutup studi kasus menggabungkan semuanya jadi satu script setup laptop baru.
15.1 Reminder dan Notifikasi Sederhana
Sub-bab ini membahas cara memunculkan notifikasi desktop dari sebuah script, lalu menjadwalkannya supaya muncul otomatis di waktu tertentu tanpa perlu dijalankan manual.
15.1.1 Notifikasi Desktop dengan notify-send
notify-send adalah command-line tool untuk memunculkan notifikasi popup di desktop, bagian dari library libnotify yang mengimplementasikan Desktop Notifications Specification dari freedesktop.org. Tool ini sudah jadi standar de facto di lingkungan desktop Linux modern yang memakai D-Bus, termasuk GNOME, KDE Plasma, dan sebagian besar window manager yang mengaktifkan notification daemon.
notify-send "Selesai Backup" "Folder Dokumen sudah dicadangkan."Argumen pertama menjadi judul notifikasi, argumen kedua menjadi isi pesannya. Beberapa opsi tambahan berguna untuk mengatur perilaku notifikasi: -u menentukan tingkat urgensi (low, normal, atau critical), dan -i menentukan ikon yang ditampilkan.
notify-send -u critical -i dialog-warning "Disk Hampir Penuh" "Sisa ruang di / tinggal 5%."Notifikasi dengan urgensi critical biasanya tidak hilang otomatis di banyak notification daemon, cocok dipakai untuk peringatan yang benar-benar butuh perhatian, seperti disk yang hampir penuh atau proses backup yang gagal. Perlu dicatat, notify-send pada dasarnya tidak terpasang bawaan di semua distro; di Debian/Ubuntu ia datang lewat package libnotify-bin, sedangkan di Fedora dan Arch Linux nama package-nya cukup libnotify. Kalau perintah notify-send tidak ditemukan, pasang dulu lewat package manager yang sesuai.
# Debian/Ubuntu
sudo apt install libnotify-bin
# Fedora
sudo dnf install libnotify
# Arch Linux
sudo pacman -S libnotifyDi lapangan, notify-send kadang tidak memunculkan apa-apa meski perintahnya berhasil dijalankan tanpa error. Penyebab paling umum: script dijalankan lewat cron atau dari sesi ssh yang tidak terhubung ke sesi desktop yang sedang aktif, sehingga notifikasi tidak tahu harus tampil ke layar mana. Kasus ini dan solusinya dibahas lebih lanjut di 15.1.3.
15.1.2 Menjadwalkan Reminder dengan Cron
Notifikasi manual hanya berguna kalau ada yang menjalankannya. Supaya reminder benar-benar muncul sendiri di waktu tertentu tanpa diingat-ingat, gabungkan notify-send dengan cron, daemon penjadwal tugas yang tersedia di hampir semua distro Linux dan juga macOS. Bab 18 nanti membahas cron dan systemd timer lebih dalam untuk kebutuhan penjadwalan di server; di sini fokusnya khusus reminder personal milik user biasa, tanpa hak akses root.
Setiap user punya crontab miliknya sendiri, diedit lewat crontab -e tanpa perlu sudo. Perintah ini membuka text editor default sesuai variabel EDITOR yang sudah disinggung di Bab 3.2.3.
crontab -eSatu baris crontab terdiri dari lima kolom waktu, diikuti perintah yang dijalankan.
0 9 * * 1-5 notify-send "Standup Time" "Jangan lupa join standup jam 9."Kelima kolom itu, secara berurutan, adalah menit (0-59), jam (0-23), tanggal (1-31), bulan (1-12), dan hari dalam seminggu (0-6, dengan 0 berarti Minggu). Baris di atas berarti "jalankan setiap jam 9 pagi, dari hari Senin sampai Jumat (1-5)". Setelah disimpan, cek isi crontab yang sedang aktif lewat crontab -l.
crontab -l15.1.3 Troubleshooting: Notifikasi Cron Tidak Muncul
Jebakan paling sering ditemui User saat memadukan cron dengan notify-send: notifikasi tidak pernah muncul, padahal baris crontab sudah benar dan menurut log cron perintahnya berhasil dieksekusi. Penyebabnya, proses cron berjalan sebagai sesi terpisah yang tidak mewarisi environment variable dari sesi desktop yang sedang aktif, khususnya DISPLAY dan DBUS_SESSION_BUS_ADDRESS, dua variabel yang dibutuhkan notify-send untuk tahu ke sesi grafis mana notifikasi harus dikirim. Ini konsekuensi langsung dari pembahasan environment variable di Bab 3.2: proses anak hanya mewarisi variabel yang di-export, dan proses cron bukan anak dari sesi desktop kita, jadi ia tidak otomatis kebagian keduanya.
Solusi paling umum adalah menyisipkan kedua variabel itu secara eksplisit di dalam crontab, mengambil nilainya dari sesi desktop yang sedang berjalan.
0 9 * * 1-5 DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send "Standup Time" "Jangan lupa join standup jam 9."Nilai /run/user/1000/bus di atas mengasumsikan user ID (UID) kita adalah 1000, UID paling umum untuk user pertama yang dibuat di banyak distro Linux, tapi ini tetap perlu diverifikasi lewat perintah id -u sebelum dipakai, karena UID bisa berbeda tergantung urutan pembuatan akun di sistem. Kalau reminder tetap tidak muncul setelah kedua variabel ini ditambahkan, kemungkinan besar notification daemon di desktop environment yang dipakai memang tidak berjalan atau memakai mekanisme berbeda; cek dulu lewat notify-send yang dijalankan langsung dari terminal di sesi desktop yang sama sebagai pembanding.
15.2 Integrasi dengan Aplikasi Desktop
Sub-bab ini membahas cara Bash berinteraksi dengan dua elemen desktop yang sering dibutuhkan dalam otomatisasi harian, yaitu clipboard dan screenshot, plus catatan penting soal perbedaan tool antar display server.
15.2.1 X11 vs Wayland: Kenapa Tool-nya Berbeda
Tool untuk mengakses clipboard maupun mengambil screenshot dari terminal tidak seragam di semua distro Linux, karena bergantung pada display server yang dipakai. Dua display server yang paling umum ditemui saat ini adalah X11 (lebih lama, masih dipakai luas) dan Wayland (lebih baru, jadi default di banyak distro modern seperti Ubuntu dan Fedora versi terkini). Setiap tool di sub-bab ini ditandai dengan jelas display server mana yang didukungnya, karena tool X11 pada umumnya tidak bekerja di sesi Wayland murni, dan sebaliknya. Cara paling cepat memastikan sesi mana yang sedang aktif adalah memeriksa variabel XDG_SESSION_TYPE.
echo "$XDG_SESSION_TYPE"15.2.2 Mengakses Clipboard dari Script
Di sesi X11, dua tool yang paling umum dipakai untuk membaca dan menulis clipboard dari terminal adalah xclip dan xsel. Keduanya perlu dipasang terpisah lewat package manager, karena bukan bagian dari Xorg maupun Bash itu sendiri.
# Debian/Ubuntu
sudo apt install xclip
# Fedora
sudo dnf install xclip
# Arch Linux
sudo pacman -S xclipecho "Teks yang mau disalin" | xclip -selection clipboard
xclip -selection clipboard -oOpsi -selection clipboard penting disebutkan eksplisit, karena X11 sebenarnya punya beberapa "papan klip" berbeda sekaligus (primary, secondary, dan clipboard), dan tanpa opsi ini xclip memakai selection primary secara default, yang isinya cuma teks hasil highlight terakhir, bukan clipboard yang dipakai perintah Paste (Ctrl+V) pada umumnya. Opsi -o (output) membaca isi clipboard, mengeluarkannya ke stdout supaya bisa ditangkap lewat command substitution (Bab 3.4.4) atau diproses lebih lanjut lewat pipe (Bab 5.3.5).
Di sesi Wayland, xclip tidak akan berfungsi. Padanannya adalah wl-clipboard, yang menyediakan dua perintah terpisah, wl-copy dan wl-paste.
# Debian/Ubuntu
sudo apt install wl-clipboardNama package ini sama persis di Fedora (sudo dnf install wl-clipboard) maupun Arch Linux (sudo pacman -S wl-clipboard), mengikuti pola tiga distro yang sudah dicontohkan lengkap di 15.1.1.
echo "Teks yang mau disalin" | wl-copy
wl-pasteDi macOS, kebutuhan yang sama jauh lebih sederhana karena sistem operasinya sudah menyediakan pbcopy dan pbpaste secara bawaan, tanpa perlu pasang apa pun tambahan.
echo "Teks yang mau disalin" | pbcopy
pbpasteStudi kasus praktis: menyalin path direktori kerja saat ini langsung ke clipboard, kombinasi pintar yang sering dibutuhkan saat berpindah-pindah proyek.
pwd | xclip -selection clipboard15.2.3 Screenshot dari Terminal
Kebutuhan screenshot otomatis lewat script juga terpecah antara X11 dan Wayland. Di X11, scrot adalah salah satu tool command-line paling ringan dan umum dipakai.
# Debian/Ubuntu
sudo apt install scrotSama seperti paket lain di bab ini, nama package scrot juga konsisten di Fedora (dnf install scrot) maupun Arch Linux (pacman -S scrot).
scrot ~/Pictures/screenshot-"$(date +%Y%m%d-%H%M%S)".pngPola date +%Y%m%d-%H%M%S di atas sama seperti teknik penamaan unik yang sudah dipakai untuk arsip backup di Bab 13.2.3, memastikan setiap screenshot punya nama file berbeda meski dijalankan berkali-kali dalam waktu berdekatan.
Di sesi Wayland, scrot tidak bekerja karena keterbatasan arsitektur keamanan Wayland yang membatasi akses langsung ke buffer layar aplikasi lain. Padanannya bergantung pada compositor yang dipakai; untuk compositor berbasis wlroots seperti Sway, tool yang umum dipakai adalah grim, dengan nama package yang sama di repository Fedora dan Arch Linux.
# Debian/Ubuntu
sudo apt install grimgrim ~/Pictures/screenshot-"$(date +%Y%m%d-%H%M%S)".pngGNOME dan KDE Plasma yang berjalan di atas Wayland punya mekanisme screenshot sendiri lewat D-Bus interface masing-masing, tidak selalu kompatibel dengan grim; kalau distro yang dipakai memakai salah satu desktop environment ini, cek dulu dokumentasi resminya untuk cara screenshot lewat terminal yang didukung secara resmi. Di macOS, screencapture sudah tersedia bawaan tanpa instalasi tambahan apa pun.
screencapture ~/Pictures/screenshot-"$(date +%Y%m%d-%H%M%S)".png15.3 Membangun Dotfiles
Sub-bab ini membahas cara menyimpan file konfigurasi personal, populer disebut dotfiles karena kebanyakan namanya diawali titik seperti .bashrc atau .gitconfig, supaya gampang dipindahkan ke komputer baru atau dipulihkan kalau sistem diinstal ulang.
15.3.1 Kenapa Dotfiles Perlu Dikelola dengan Git
File konfigurasi seperti .bashrc, .gitconfig, dan .vimrc biasanya berisi hasil kustomisasi bertahun-tahun milik User: alias favorit (Bab 13.4), fungsi shell yang sering dipakai, preferensi editor, dan pengaturan lain yang tidak terasa berharga sampai hilang saat sistem diinstal ulang atau berpindah ke laptop baru. Menyimpan seluruh dotfiles ini dalam satu repository Git, sebagaimana lazim dipraktikkan komunitas open-source dan dibahas lebih dalam soal versioning script di Bab 26.3, membuat riwayat perubahan konfigurasi tetap tercatat dan gampang dipulihkan di komputer mana pun.
15.3.2 Struktur Dotfiles dan Symlink
Pendekatan paling umum: kumpulkan semua dotfiles ke dalam satu folder repository khusus, lalu buat symbolic link dari lokasi aslinya (misalnya ~/.bashrc) menunjuk ke file di dalam repository itu, sehingga mengedit file di repository otomatis berefek ke konfigurasi aktif, dan perubahannya gampang di-commit.
mkdir -p ~/dotfiles
mv ~/.bashrc ~/dotfiles/bashrc
ln -s ~/dotfiles/bashrc ~/.bashrcln -s membuat symbolic link, bukan menyalin file. Setelah baris ini dijalankan, ~/.bashrc jadi sekadar "pintasan" yang menunjuk ke ~/dotfiles/bashrc, sehingga isi keduanya selalu identik. Untuk dotfiles yang jumlahnya banyak, mengulang pola mv lalu ln -s satu per satu cukup melelahkan; tool khusus bernama GNU Stow dirancang untuk mengotomasi pola symlink seperti ini berdasarkan struktur folder yang sudah rapi.
# Debian/Ubuntu
sudo apt install stowNama package stow juga sama di Fedora dan Arch Linux.
cd ~/dotfiles
stow bashMenurut dokumentasi resmi GNU Stow, perintah stow bash di atas membaca isi folder bash/ di dalam repository dotfiles, lalu membuat symlink untuk setiap file di dalamnya ke direktori satu tingkat di atas folder repository (dalam kasus ini, ke $HOME), sambil menjaga struktur foldernya tetap sama. Pola ini memudahkan mengelompokkan dotfiles per aplikasi, misalnya folder bash/, git/, dan vim/ terpisah, tapi tetap satu perintah untuk mengaktifkan semuanya.
15.3.3 Script Instalasi Dotfiles yang Idempoten
Supaya proses memasang dotfiles di komputer baru tidak perlu diketik manual berulang, bungkus langkahnya jadi satu script instalasi. Prinsip idempotent, yaitu aman dijalankan berkali-kali tanpa efek samping tak terduga, penting diterapkan di sini dan dibahas lebih mendalam sebagai prinsip keamanan script di Bab 23.2.
#!/bin/bash
set -euo pipefail
DOTFILES_DIR="$HOME/dotfiles"
if [[ ! -d "$DOTFILES_DIR" ]]; then
git clone https://github.com/username/dotfiles.git "$DOTFILES_DIR"
fi
cd "$DOTFILES_DIR"
for target in bash git vim; do
stow -v "$target"
doneset -euo pipefail di baris kedua adalah kombinasi opsi set yang dibahas tuntas di Bab 25.1, dipakai di sini supaya script langsung berhenti kalau ada perintah yang gagal, alih-alih melanjutkan proses instalasi dengan kondisi yang sudah tidak konsisten. Pengecekan [[ ! -d "$DOTFILES_DIR" ]] memastikan git clone hanya dijalankan kalau folder repository belum ada, sehingga script ini aman dijalankan ulang tanpa memicu error "destination path already exists" dari git. stow sendiri, menurut dokumentasi resminya, juga bersifat aman dijalankan berulang selama symlink yang sudah ada memang mengarah ke lokasi yang sama; ia hanya akan melaporkan konflik kalau ternyata ada file asli (bukan symlink) yang menghalangi di lokasi tujuan.
15.4 Studi Kasus: Setup Laptop Baru Sekali Jalan
Skenario yang sering dialami User: laptop baru datang, lalu berjam-jam dihabiskan memasang ulang aplikasi dan menyalin konfigurasi lama satu per satu sebelum benar-benar siap dipakai kerja. Studi kasus penutup ini menggabungkan teknik dari sub-bab sebelumnya menjadi satu script yang menyiapkan laptop baru secara otomatis: memasang package penting, memulihkan dotfiles, dan mengaktifkan reminder dasar, semuanya dari satu kali eksekusi.
15.4.1 Rancangan Script Setup
Script setup laptop baru punya kebutuhan khas dibanding script otomatisasi lain di bab-bab sebelumnya: ia harus bisa berjalan di sistem yang benar-benar "kosong", sebelum kita sempat memasang tool favorit apa pun, dan idealnya tetap berfungsi di lebih dari satu distro, mengingat tidak semua User memakai distro yang sama. Konsekuensinya, script ini perlu mendeteksi dulu distro yang sedang dipakai sebelum memilih package manager yang sesuai, memakai case statement dari Bab 6.3 dikombinasikan dengan isi file /etc/os-release, file standar freedesktop.org yang berisi identitas distro dan tersedia di hampir semua distro Linux modern.
15.4.2 Implementasi Script Lengkap
#!/bin/bash
set -euo pipefail
DOTFILES_DIR="$HOME/dotfiles"
DOTFILES_REPO="https://github.com/username/dotfiles.git"
# 1. Deteksi distro dan pasang paket dasar
if [[ -f /etc/os-release ]]; then
. /etc/os-release
else
echo "Tidak bisa mendeteksi distro, keluar." >&2
exit 1
fi
case "$ID" in
ubuntu|debian)
paket=(git curl vim tmux stow libnotify-bin xclip)
sudo apt update
sudo apt install -y "${paket[@]}"
;;
fedora)
paket=(git curl vim tmux stow libnotify xclip)
sudo dnf install -y "${paket[@]}"
;;
arch)
paket=(git curl vim tmux stow libnotify xclip)
sudo pacman -Sy --noconfirm "${paket[@]}"
;;
*)
echo "Distro '$ID' belum didukung script ini." >&2
exit 1
;;
esac
# 2. Clone dan pasang dotfiles
if [[ ! -d "$DOTFILES_DIR" ]]; then
git clone "$DOTFILES_REPO" "$DOTFILES_DIR"
fi
cd "$DOTFILES_DIR"
for target in bash git vim; do
stow -v "$target"
done
# 3. Reminder review konfigurasi mingguan
( crontab -l 2>/dev/null; echo "0 9 * * 1 notify-send 'Review Dotfiles' 'Cek update dotfiles minggu ini.'" ) | sort -u | crontab -
echo "Setup laptop selesai."Baris . /etc/os-release memakai source singkat (Bab 13.4.2) untuk memuat isi file itu langsung sebagai variabel shell, termasuk variabel ID yang berisi nama distro dalam huruf kecil, seperti ubuntu, fedora, atau arch, sesuai spesifikasi os-release dari freedesktop.org. case "$ID" lalu memilih perintah package manager yang tepat sesuai distro, pola yang sama seperti dicontohkan di Bab 6.3, dengan cabang *) sebagai jaring pengaman kalau distro yang terdeteksi belum didukung script ini. Array paket dari Bab 4.1 sengaja didefinisikan terpisah di tiap cabang case, bukan satu array tunggal di luar case, karena nama package tidak selalu sama persis antar distro: libnotify-bin adalah nama package khusus Debian/Ubuntu, sedangkan Fedora dan Arch Linux menyediakan tool yang sama persis lewat nama package libnotify tanpa akhiran -bin. Jebakan ini gampang luput disadari kalau langsung menyalin satu daftar package yang sama untuk dipakai di semua distro tanpa dicek ulang satu per satu, dan berujung perintah install gagal di tengah jalan karena nama package tidak ditemukan.
Karena stow sudah ikut dipasang di langkah 1 untuk ketiga distro, dan set -e membuat script otomatis berhenti kalau instalasi paket gagal, langkah 2 bisa langsung memakai stow tanpa perlu pengecekan tambahan. Baris terakhir menambahkan baris crontab baru dari 15.1.2 tanpa menghapus baris lain yang sudah ada sebelumnya: crontab -l 2>/dev/null membaca crontab lama (mengabaikan error kalau memang belum ada crontab sama sekali), digabung lewat pipe dengan baris reminder baru, disaring duplikatnya lewat sort -u, baru ditulis ulang jadi crontab aktif lewat crontab -. Pola gabung-lalu-tulis-ulang ini penting dipahami karena crontab -e saja tidak praktis dipanggil dari dalam script otomatis, sedangkan menimpa langsung lewat crontab tanpa membaca isi lama lebih dulu akan menghapus semua baris lain yang sudah ada. Perlu jujur dicatat, 2>/dev/null di baris ini juga membungkam pesan error lain yang sebenarnya tidak terkait kondisi "crontab belum ada"; kalau baris reminder ternyata tidak pernah muncul setelah script dijalankan, jalankan dulu crontab -l tanpa redirection untuk melihat pesan error aslinya.
15.4.3 Verifikasi dan Pengembangan Lanjutan
Setelah script dijalankan, verifikasi tiga hal utama: package dasar sudah terpasang lewat command -v git curl vim tmux, dotfiles sudah ter-symlink dengan benar lewat ls -la ~ | grep dotfiles, dan baris crontab baru sudah masuk lewat crontab -l.
command -v git curl vim tmux
ls -la ~ | grep dotfiles
crontab -lScript ini sengaja dijaga tetap sederhana sebagai titik awal; pengembangan wajar yang bisa ditambahkan antara lain opsi --dry-run seperti dibahas di Bab 13.1.4 untuk melihat dulu apa saja yang akan dipasang sebelum benar-benar dieksekusi, atau validasi tambahan sebelum sudo apt install dijalankan tanpa pengawasan penuh. Empat topik produktivitas di bab ini, notifikasi, integrasi desktop, dotfiles, dan setup otomatis, melengkapi kebutuhan Bash untuk penggunaan personal sehari-hari milik User. Bab 16 melanjutkan ke sisi kustomisasi shell itu sendiri, mulai dari prompt sampai membangun dotfiles pribadi yang benar-benar portable antar sistem.

