24 poin oleh GN⁺ 2025-10-23 | 2 komentar | Bagikan ke WhatsApp
  • 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
    • Contoh:
      # Download a file and extract it  
      tempe  
      wget 'https://example.com/big_file.tar.xz'  
      tar -xf big_file.tar.xz  
      # ...do something with the file...  
      
      # Write a quick throwaway script to try something out  
      tempe  
      vim foo.py  
      python3 foo.py  
      
  • 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

 
GN⁺ 2025-10-23
Komentar Hacker News
  • Perintah trash a.txt b.png akan memindahkan file a.txt dan b.png ke 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 bawaan trash di 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

      $ echo '{ "hello": "world" }' | python3 -m json.tool
      {
        "hello": "world"
      }
      
    • 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 sampah

    • Sebagai 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

    sed -n 2p file
    

    Bisa menampilkan baris kedua. Untuk beberapa baris juga bisa

    sed -n 2,4p file
    

    jadi lebih menguntungkan daripada script line

    • Saya sering perlu merangkai beberapa perintah sed. Setiap kali begitu, saya harus terus mengubah perintah sed pertama. Kadang saya juga butuh grep sebelum sed, tetapi kalau dipecah dengan cat, tail, head, setiap fungsi bisa dipakai seperti modul sehingga lebih fleksibel. Itu sesuai dengan filosofi Unix yang membuat tiap tool hanya melakukan satu hal
  • Saya punya beberapa script sederhana yang sering dipakai. Contohnya:

    #!/usr/bin/env bash
    # ~/bin/,dehex
    
    echo "$1" | xxd -r -p
    
    #!/usr/bin/env bash
    # ~/bin/,ht
    
    highlight() {
      # warna: 30=hitam, 31=merah, 32=hijau, ...
      escape=$(printf '\033')
      sed "s,$2,${escape}[$1m&${escape}[0m,g"
    }
    
    if [[ $# == 1 ]]; then
      highlight 31 $1
    elif [[ $# == 2 ]]; then
      highlight 31 $1 | highlight 32 $2
    elif [[ $# == 3 ]]; then
      highlight 31 $1 | highlight 32 $2 | highlight 35 $3
    elif [[ $# == 4 ]]; then
      highlight 31 $1 | highlight 32 $2 | highlight 35 $3 | highlight 36 $4
    fi
    

    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 unmv

    #!/bin/sh
    if test "$#" != 2
    then
      echo 'Error: unmv must have exactly 2 arguments'
      exit 1
    fi
    exec mv "$2" "$1"
    
  • Ada 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

    • Sangat setuju. Saya akhirnya juga hanya memakai standar agar bisa bekerja di mana saja. Tapi tool yang benar-benar bagus pada akhirnya bisa menjadi instalasi default atau setidaknya mudah dipasang lewat apt-get. Menurut saya, bentuk package yang dikelola dengan baik lebih diinginkan daripada sekumpulan script pribadi
  • Saya bagikan script ekstraksi arsip favorit saya

    # ex - archive extractor
    # usage: ex <file>
    function ex() {
      if [ -f $1 ] ; then
      case $1 in
        *.tar.bz2) tar xjf $1 ;;
        *.tar.gz) tar xzf $1 ;;
        *.tar.xz) tar xf $1 ;;
        *.bz2) bunzip2 $1 ;;
        *.rar) unrar x $1 ;;
        *.gz) gunzip $1 ;;
        *.tar) tar xf $1 ;;
        *.tbz2) tar xjf $1 ;;
        *.tgz) tar xzf $1 ;;
        *.zip) unzip $1 ;;
        *.Z) uncompress $1;;
        *.7z) 7z x $1 ;;
        *) echo "'$1' cannot be extracted via ex()" ;;
      esac
      else
        echo "'$1' is not a valid file"
      fi
    }
    
    • 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

    ffmp4() {
      input_file="$1"
      output_file="${input_file%.*}_sd.mp4"
    
      ffmpeg -i "$input_file" -c:v libx264 -crf 33 -profile:v baseline -level 3.0 -pix_fmt yuv420p -movflags faststart "$output_file"
    
      echo "Compressed video saved as: $output_file"
    }
    
    ffmp4 foo.webm  # dikonversi menjadi foo_sd.mp4
    
    fftime() {
      input_file="$1"
      output_file="${input_file%.*}_cut.mp4"
      ffmpeg -i "$input_file" -c copy -ss "$2" -to "$3" "$output_file"
    
      echo "Cut video saved as: $output_file"
    }
    
    fftime foo.mp4 01:30 01:45  # membuat foo_cut.mp4
    

    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 copy

  • Setiap kali membuat dan menguji alias atau function, saya suka langsung menerapkan ~/.zshrc, jadi saya memakai alias seperti ini

    alias vz="vim ~/.zshrc && . ~/.zshrc"
    

    Dan di Mac, saya memakai function berikut untuk grep file docx

    docgrep() {
      mdfind "\"$@\"" -onlyin /Users/xxxx/Notes 2> >(grep --invert-match ' [UserQueryParser] ' >&2) | grep -v -e '/Inactive/' | sort
    }
    

    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

    anonymizeclipboard() {
      my_user_id=xxxx
      account_ids="1234567890|1234567890" #regex
      corp_words="xxxx|xxxx|xxxx|xxxx|xxxx" #regex
      project_names="xxxx|xxxx|xxxx|xxxx|xxxx" # regex
      pii="xxxx|xxxx|xxxx|xxxx|xxxx|xxxx" # regex
      hostnames="xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx" # regex
      pbpaste | sed -E -e 's/([0-9]{1,3})\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/\1.x.x.x/g' \
      -e "s/(${corp_words}|${project_names}|${my_user_id}|${pii}|${hostnames})/xxxx/g" -e "s/(${account_ids})/1234567890/g" | pbcopy
      pbpaste
    }
    alias anon=anonymizeclipboard
    
    • Ini benar-benar bagus. Hal seperti ini sering terjadi pada saya, tetapi saya kesulitan menemukan cara yang pas untuk menanganinya
 
krepe90 2025-10-24

Saya juga teringat dengan tulisan yang pernah muncul di GeekNews, Ask GN: Apakah Anda punya shell snippet yang sering digunakan?