- Memperkenalkan skrip-skrip shell yang paling sering digunakan dari berbagai skrip yang ditulis sambil memelihara dotfiles selama lebih dari 10 tahun
- Dibagi menjadi clipboard, manajemen file, internet, pemrosesan teks, peluncur REPL, tanggal/waktu, AV, proses, referensi cepat, sistem, dan serba-serbi, dengan tiap skrip disajikan dalam bentuk wrapper singkat dan berfokus pada contoh penggunaan nyata
- Sebagian besar skrip berjalan di macOS dan Linux, dengan filosofi inti: “meratakan kerepotan-kerepotan kecil dari alat yang sudah ada”
- Mengintegrasikan utilitas standar seperti
pbcopy/xclip, python3 -m http.server, yt-dlp, ffmpeg, mpv, dan lain-lain
- Yang paling sering dipakai antara lain
copy/pasta/pastas/cpwd, mkcd/tempe/trash/mksh, serveit/getsong/getpod/getsubs, scratch/straightquote/markdownquote, timer/boop/tunes, dan sebagainya
Perkenalan skrip yang paling sering saya gunakan dari dotfiles saya
- Dari berbagai skrip shell yang saya buat sambil mengelola dotfiles pribadi selama lebih dari 10 tahun, saya merangkum skrip yang sering digunakan berdasarkan kategori
- Tiap skrip disertai tujuan, frekuensi penggunaan, dan contoh representatif untuk meningkatkan kemungkinan langsung dipakai
- Tujuan bersama dari semuanya adalah memangkas pekerjaan berulang, abstraksi lintas platform, serta meningkatkan keamanan dan keterbacaan
Skrip terkait clipboard
copy dan pasta: wrapper yang membungkus manajer clipboard sistem, berbasis pbcopy di macOS atau xclip di Linux
copy: menyalin output ke clipboard
pasta: mengambil teks dari clipboard dan mencetaknya
- Contoh:
run_some_command | copy, pasta > file.txt, vim "$(pasta)", pasta | base64 --decode
pastas: alat yang mencetak konten baru secara real-time setiap kali status clipboard berubah
- Berguna untuk menyimpan semua tautan yang disalin ke file, atau mengunduh banyak tautan sekaligus
- Contoh:
pastas > everything_i_copied.txt, pastas | wget -i -
cpwd: menyalin path direktori saat ini ke clipboard
- Praktis saat berpindah direktori di beberapa tab terminal
Skrip manajemen file
mkcd foo: membuat direktori dan langsung masuk ke sana (singkatan dari mkdir foo && cd foo)
tempe: masuk ke direktori sementara (cd "$(mktemp -d)"), sehingga saat kerja sementara di lingkungan sandbox tidak perlu repot membereskan
trash: memindahkan file ke tempat sampah (mendukung macOS/Linux), untuk mencegah kesalahan dibanding rm biasa
mksh: membuat file shell script baru, menjadikannya executable, lalu langsung membukanya di editor
Skrip terkait internet
serveit: menjalankan server file statis dari direktori lokal (port default 8000, dengan alternatif jika Python tidak terpasang)
getsong menggunakan yt-dlp untuk mengunduh audio dengan kualitas terbaik
getpod adalah wrapper untuk mengambil audio dari video agar cocok untuk podcast
getsubs mengekstrak subtitle bahasa Inggris dengan logika yang mengutamakan subtitle resmi dan fallback ke subtitle otomatis. Cocok untuk pipeline peringkasan dan keperluan cadangan
wifi off/on/toggle: mengontrol WiFi sistem, dipakai saat memecahkan masalah jaringan
url: mem-parsing string URL untuk memisahkan dan mengekstrak protokol, hostname, path, query, hash, dan sebagainya
Skrip pemrosesan teks
line 10: mencetak baris tertentu dari input standar (mirip head dan tail)
scratch: untuk cepat membuka buffer teks sementara di Vim seperti $EDITOR $(mktemp), cocok untuk catatan sekali pakai atau pekerjaan transformasi kecil
straightquote: mengubah smart quotes menjadi tanda kutip biasa (lurus), mencegah masalah kutip di dalam kode sekaligus mengurangi ukuran file
markdownquote: membuat kutipan Markdown dengan menambahkan > di depan tiap baris
length: mengembalikan panjang string input (bisa menggantikan wc -c)
jsonformat: mencetak data JSON dengan rapi
uppered/lowered: mengubah string menjadi huruf besar/huruf kecil
nato bar: mengubah string input menjadi kode alfabet NATO (Bravo Alfa Romeo, dan sebagainya)
u+ 2025: melihat nama dan simbol karakter Unicode
snippets foo: memanggil frasa singkat tertentu dari kamus snippet pribadi
snippet arrow menghasilkan panah →, dan snippet recruiter menghasilkan pesan templat seperti “not interested”
Terkait peluncur REPL
- Terinspirasi dari
irb milik Ruby untuk menjalankan REPL berbagai bahasa dengan cepat:
iclj: Clojure
ijs: Deno (atau Node jika tidak ada)
iphp: PHP
ipy: Python
isql: SQLite (mode memori di Bash)
Skrip tanggal dan waktu
hoy: mencetak tanggal saat ini dalam format ISO (contoh: 2020-04-20), berguna sebagai prefiks nama file dan sebagainya
timer 10m: timer durasi (misalnya 10 menit), mengirim suara dan notifikasi OS saat selesai
rn: menggunakan date dan cal untuk menampilkan waktu saat ini dan kalender bulanan dengan rapi
Pemrosesan audio, video, dan gambar
ocr: mengekstrak teks dari file gambar di macOS (direncanakan akan diperluas)
boop: notifikasi suara berdasarkan berhasil/gagalnya perintah terakhir (intuitif dipakai misalnya setelah menjalankan pengujian)
sfx: memutar file efek suara tertentu (.ogg), terhubung dengan boop dan timer
tunes: memutar file audio dengan mpv (mendukung shuffle)
pix: melihat foto dengan mpv
radio: peluncur cepat untuk stasiun radio internet favorit
speak: menghapus Markdown dari teks yang dibaca dari stdin lalu melakukan sintesis suara (TTS)
shrinkvid: mengompresi file video dengan ffmpeg
removeexif: menghapus data EXIF dari JPEG, dengan rencana mendukung lebih banyak format ke depan
tuivid: menonton video di dalam terminal, jarang dipakai secara praktis tetapi punya fungsi yang unik
Manajemen proses
each: alternatif untuk xargs dan find ... -exec, memudahkan eksekusi perintah yang kompleks
running foo: mencari proses yang sedang berjalan berdasarkan kata kunci tertentu (PID, perintah, dan lain-lain) lalu menampilkannya dalam format yang mudah dibaca
murder: pembungkus kill yang mematikan proses secara bertahap, dari sinyal lembut hingga paksa. Membantu mencegah kesalahan saat meminta program berhenti
waitfor $PID: menunggu sampai PID tertentu selesai, sambil tetap menjaga proses tetap aktif
bb my_command: menjalankan perintah dalam mode background sungguhan, cocok untuk daemon dan sejenisnya
prettypath: menampilkan $PATH per baris agar lebih mudah dilihat sekilas (berguna saat debugging)
tryna my_command/trynafail my_command: mengulang sampai perintah berhasil (run until success), atau sampai gagal (run until fail), bisa diterapkan untuk berbagai otomatisasi seperti jaringan
Alat referensi cepat
emoji: mencari dan menampilkan emoji berdasarkan kata kunci
httpstatus: menampilkan seluruh daftar kode status HTTP dan penjelasan kode tertentu
alphabet: menampilkan seluruh alfabet Inggris huruf kecil dan huruf besar (ternyata cukup sering dipakai)
Manajemen sistem
theme 0/theme 1: mengganti tema sistem secara menyeluruh (gelap/terang), terhubung dengan Vim, Tmux, dan lainnya
sleepybear: membuat sistem masuk ke mode tidur (macOS, Linux)
ds-destroy: menghapus file .DS_Store secara rekursif, berguna saat merapikan folder pengguna macOS
Lain-lain
catbin foo: langsung melihat source code file di dalam PATH
notify: mengirim notifikasi level OS, sehingga pekerjaan panjang bisa langsung diketahui saat selesai
uuid: membuat UUID versi 4
Kesimpulan
- Skrip-skrip yang diperkenalkan di tulisan ini adalah alat yang benar-benar sering dipakai penulis
- Skrip perintah singkat buatan sendiri sangat efektif untuk meningkatkan efisiensi kerja, mencegah kesalahan, dan menaikkan produktivitas
- Anda juga disarankan untuk membuat dan memanfaatkan skrip otomatisasi versi Anda sendiri
2 komentar
Komentar Hacker News
Perintah
trash a.txt b.pngakan memindahkan filea.txtdanb.pngke tempat sampah, didukung di Mac dan Linux. Cara yang dulu saya pakai memproses file satu per satu, jadi suara penghapusan terdengar untuk setiap file dan hanya file terakhir yang bisa dipulihkan dengan ⌘Z di Finder. Itu bisa diperbaiki, tapi sebenarnya lebih praktis memakai perintah resmi bawaantrashdi macOS. Karena tidak memakai Finder, tidak ada suara atau pemulihan ⌘Z, tetapi lebih cepat dan fitur “Put Back” tetap berfungsi. Untuk pretty-print JSON juga, kalau memakai jq alih-alih node, bisa diselesaikan dengan kode yang jauh lebih singkat, dan di macOS belakangan ini jq sudah terpasang sebelumnya. Hal yang sama berlaku untuk mencetak uuid: jika butuh v4 UUID, paling aman pakai uuidgen (lihat man page)Sering kali lebih baik memakai fitur bawaan daripada self-script. Misalnya di vim, alih-alih memakai markdownquote, cukup pilih kolom pertama dengan ctrl-v lalu tekan "i> " dan escape. Lebih pendek dan efisien. Saya penasaran kenapa u+ 2025 mengembalikan ñ, padahal nilai Unicode sebenarnya adalah U+00F1. Dan catbin foo sama dengan cat "$(which foo)". Kalau memakai zsh, cat =foo lebih singkat dan lebih kuat. Di zsh, auto-complete bekerja setelah =, jadi aman dipakai bahkan untuk perintah yang panjang. Saya sering memakai hal seperti file =firefox, vim =myscript.sh
Saya menduga penulisnya tidak tahu soal uuidgen. Saya suka saat berbagi pengetahuan atau konfigurasi seperti ini selalu menyingkap blind spot saya, itulah kenapa berbagi itu penting
Python juga bisa pretty-print JSON secara bawaan
Terima kasih untuk info
trash-nya. Selama ini saya memakai AppleScript seperti "tell app "Finder" to move {%s} to trash" untuk memindahkan banyak file ke tempat sampahSebagai alternatif untuk rm dan trash, saya juga merekomendasikan rip tautan proyek rip
Siklus hidup developer memang menarik. Awalnya hanya memakai environment shell vanilla, lalu di tahun pertama atau kedua membuat script dan bash alias sampai ratusan baris. Sekarang setelah 15 tahun, saya justru sebisa mungkin hanya memakai shell default, tidak pakai alias, dan hal-hal kompleks saya tangani dengan Python atau Go
Kecenderungan ini rasanya bukan karena semacam pencerahan, melainkan cuma karena malas (saya bilang begitu karena saya juga sama). Berkat rekan kerja yang suka mendalami custom environment, saya jadi sering belajar tool baru, dan belakangan ini juga menambahkan tool seperti atuin dan fzf ke Linux saya
Saya menulis alias dan function di dotfile untuk mencatat/mengingat perintah yang sering dipakai. Kumpulan tool yang sering dipakai terus saya perbarui, dan mudah juga dipindahkan ke workstation baru
Dulu waktu saya hanya punya satu komputer nix, saya ingin banyak melakukan kustomisasi. Sekarang karena memakai beberapa mesin sekaligus, saya cukup memasang package yang diperlukan agar environment tetap seragam
Yang ditulis dengan Python pun masih saya sebut script. Menurut saya istilah script tidak terbatas hanya pada shell script
Belakangan ini, saat bekerja dengan engineer muda dan melihat mereka memakai berbagai dotfiles, saya merasa “dulu saya juga seperti itu, dan memang merepotkan.” Sekarang saya memakai tool secara selektif dan menyesuaikannya secara fleksibel sesuai kebutuhan. Saya juga menghormati gaya orang lain
Saya sangat suka menemukan posting berisi tips praktis seperti ini di HN. Saya penasaran bagaimana developer lain benar-benar bekerja, dan apa yang bisa saya pelajari lalu terapkan. Awalnya mungkin terasa seperti “saya tidak akan butuh ini,” tetapi kalau suatu pekerjaan jadi lebih mudah, pekerjaan itu sendiri bisa melahirkan workflow baru. Jadi saya cenderung mencobanya dulu lalu mempertahankan yang cocok. Saya juga suka gaya tulisan posting aslinya—menyertakan frekuensi penggunaan itu benar-benar praktis. Untuk pekerjaan sederhana, saya sering cukup membuka devtools browser dan menyelesaikannya dengan JavaScript. (Misalnya saat mengubah string menjadi huruf kecil)
Akan menarik kalau dilakukan cost-benefit analysis yang nyata dengan menghitung waktu yang dibutuhkan untuk cara penulis vs cara saya, termasuk biaya membuat/mengingat/merujuk/memigrasikan script
Gambar cheatsheet shortcut Bash ini sangat membantu
Daripada script line, lebih sederhana menampilkan baris tertentu dengan sed
Bisa menampilkan baris kedua. Untuk beberapa baris juga bisa
jadi lebih menguntungkan daripada script line
Saya punya beberapa script sederhana yang sering dipakai. Contohnya:
Script pribadi saya beri awalan , (koma) agar bisa cepat diakses. Saya merasa ada nilainya untuk secara berkala membuat statistik dari script pribadi saya di history, lalu merapikan yang sudah tidak dipakai lagi
Saya belum berhasil menggeneralisasikannya, tapi saya cukup nyaman bekerja dengan script
unmvAda banyak tips bagus, tetapi saya umumnya belajar dan memakai utilitas standar (sed, awk, grep, xargs, dll.). Alasannya, saya sering bekerja berpindah-pindah sistem, dan script serta alias pribadi saya biasanya tidak terpasang di sana. Dengan utilitas standar, hampir semua hal bisa dilakukan
Saya bagikan script ekstraksi arsip favorit saya
Saya ingin membuat counterpart kebalikannya untuk mengompresi
Saya memakai dtrx, dan saya suka karena otomatis mengekstrak arsip ke dalam folder
Buat saya aunpack lebih nyaman
Benar-benar rapi
Kalau ditambah inotify dan systemd user service, sepertinya bisa naik satu level. Versi dalam bentuk package juga sudah ada. Yang dibuat sendiri terasa seperti roda persegi (reinventing the wheel)
Saya punya dua function yang selalu saya pakai untuk encoding atau memotong mp4. Flag-nya membuat kompatibilitasnya sangat tinggi untuk berbagai environment seperti WhatsApp, Discord mobile, dan lainnya
fftime memotong dengan cepat tanpa re-encode file asli, tetapi tergantung videonya bisa ada sedikit masalah (misalnya tidak bisa diputar). Untuk re-encode, cukup hapus
-c copySetiap kali membuat dan menguji alias atau function, saya suka langsung menerapkan
~/.zshrc, jadi saya memakai alias seperti iniDan di Mac, saya memakai function berikut untuk grep file docx
Selain itu, saat menempelkan clipboard Mac saya ke kanal publik seperti ChatGPT atau Slack internal perusahaan, saya menjalankan function berikut untuk menganonimkannya demi keperluan debugging. Saat function dijalankan, clipboard yang sudah diubah akan ditampilkan ke stdout, jadi saya bisa mengecek apakah ada bagian yang terlewat
Saya juga teringat dengan tulisan yang pernah muncul di GeekNews, Ask GN: Apakah Anda punya shell snippet yang sering digunakan?