71 poin oleh GN⁺ 24 hari lalu | 3 komentar | Bagikan ke WhatsApp
  • Ringkasan cara meningkatkan kecepatan dan efisiensi kerja di lingkungan shell dengan memanfaatkan berbagai shortcut keyboard dan kombinasi perintah
  • Shortcut dasar seperti CTRL + W, U, K, Y untuk mengedit baris, CTRL + A/E, ALT + B/F untuk memindahkan kursor, dan reset untuk memulihkan terminal
  • Di Bash dan Zsh, CTRL + R untuk mencari riwayat perintah, !!·!$·ESC+. untuk memakai ulang perintah sebelumnya, serta Brace Expansion dan Globstar untuk mengotomatisasi pekerjaan berulang
  • Fitur lanjutan seperti Process Substitution, tee, dan bg/disown membantu kontrol proses dan pengelolaan log menjadi lebih efisien
  • Jika shell dikuasai seperti kotak peralatan, produktivitas dan fokus dapat meningkat, dan kuncinya adalah membiasakan shortcut satu per satu

Shortcut dan fitur dasar yang bekerja di hampir semua shell

  • Kombinasi CTRL + W, U, K, Y adalah shortcut edit baris untuk cepat menghapus atau memulihkan kata maupun bagian depan/belakang baris berdasarkan posisi kursor

    • CTRL + W menghapus kata di depan kursor
    • CTRL + U memotong dari kursor hingga awal baris, dan bisa ditempel kembali dengan CTRL + Y
    • CTRL + K memotong dari kursor hingga akhir baris
    • CTRL + A / E berpindah ke awal dan akhir baris, ALT + B / F berpindah maju-mundur per kata
    • Aktif secara default di sebagian besar terminal, dan di Mac tombol Option harus disetel sebagai Meta agar berfungsi
    • Perintah reset atau stty sane dapat memulihkan terminal yang rusak karena tidak sengaja menampilkan file biner
    • Meski layar rusak, input tetap bisa dilakukan, jadi ketik reset lalu Enter untuk memulihkan
    • CTRL + C / D masing-masing menghentikan perintah dan mengirim sinyal EOF (akhir file)
    • Menekan CTRL + D pada prompt kosong akan menutup shell
    • CTRL + L setara dengan perintah clear untuk segera membersihkan layar
    • Prompt dipindahkan ke bagian atas layar sambil mempertahankan perintah yang sedang diketik
    • cd - langsung berpindah ke direktori sebelumnya, sementara pushd / popd memungkinkan berpindah antar beberapa lokasi dengan stack direktori
    • > file.txt mengosongkan file tanpa menghapusnya sehingga izin dan kepemilikan tetap dipertahankan
    • Variabel $_ memakai ulang argumen terakhir dari perintah sebelumnya
    • Contoh: mkdir -p /path/newdir && cd "$_"
    • set -e, set -u adalah opsi untuk meningkatkan keamanan skrip
    • set -e langsung keluar saat terjadi error
    • set -u memicu error saat mereferensikan variabel yang belum didefinisikan
    • Kombinasi set -euo pipefail memberi perlindungan yang lebih kuat

Shortcut dan fitur lanjutan di Bash dan Zsh

  • CTRL + R melakukan pencarian inkremental mundur di riwayat perintah
    • Saat kata kunci diketik, perintah lama bisa langsung ditemukan dan dipakai lagi
  • !! menjalankan ulang seluruh perintah sebelumnya
    • sudo !! dapat menjalankan ulang perintah terakhir dengan hak administrator
  • CTRL + X, CTRL + E membuka perintah yang sedang diketik di editor bawaan (Vim, Nano, dll.) untuk diedit lalu dijalankan
    • Di Zsh perlu konfigurasi tambahan
    • Perintah fc adalah cara tradisional untuk membuka perintah sebelumnya di $EDITOR lalu mengeditnya
  • ESC + . atau ALT + . menyisipkan argumen terakhir dari perintah sebelumnya di posisi kursor
    • Jika ditekan berulang, argumen dari perintah yang lebih lama bisa diputar satu per satu
    • !$ menjalankan fungsi yang sama secara non-interaktif
  • Brace Expansion adalah fitur ekspansi kurung kurawal untuk mengurangi input berulang

    • cp pf.conf{,.bak}cp pf.conf pf.conf.bak
    • mv filename.{txt,md}mv filename.txt filename.md
    • mkdir -p project/{src,tests,docs} membuat beberapa direktori sekaligus
    • Process Substitution <(command) memperlakukan output perintah seperti file
    • Contoh: diff <(sort file1.txt) <(sort file2.txt) untuk membandingkan tanpa file sementara
    • Globstar(**) menelusuri file secara rekursif hingga subdirektori
    • Di Bash, aktifkan dengan shopt -s globstar, sedangkan di Zsh aktif secara default
    • Contoh: ls **/*.js untuk mencari file JS di semua subfolder
  • Kombinasi CTRL + Z, bg, disown menjalankan proses di background dan melepaskannya dari shell

    • CTRL + Z untuk jeda sementara → bg untuk menjalankan di background → disown untuk melepaskannya dari shell
    • Proses tetap bisa berjalan meski sesi SSH ditutup
    • command |& tee file.log mengalirkan standard output (stdout) dan standard error (stderr) sekaligus ke pipe
    • |& adalah bentuk singkat dari 2>&1 |
    • Dengan tee, output tetap tampil di layar sambil disimpan ke log

Saran inti dalam memanfaatkan shell

  • Shell adalah kotak peralatan, dan jika dikuasai dengan baik dapat sangat meningkatkan produktivitas
  • Daripada menghafal semua shortcut sekaligus, lebih efektif untuk membiasakannya satu per satu
  • Input berulang dan pengetikan yang tidak perlu bisa dikurangi untuk menyederhanakan alur kerja
  • Jika sudah terbiasa, terminal bukan lagi hambatan, melainkan ruang kerja sendiri

3 komentar

 
phoon 21 hari lalu

Hampir semuanya adalah keybinding emacs, tetapi emacs sendiri nyaris tidak disebutkan; melihatnya belakangan ini banyak dibagikan sebagai tip membuat saya merasa zaman benar-benar sudah berubah. Library readline pada dasarnya mengimplementasikan keybinding emacs di mana-mana. Rasanya sudah hampir 20 tahun sejak semuanya beralih ke IDE, tetapi dari sudut pandang fosil yang masih memakai hal seperti gdbtui, saya jadi berpikir bahwa hal yang benar-benar bagus memang tidak pernah mati.

 
GN⁺ 24 hari lalu
Komentar Hacker News
  • Saya merasa hidup saya berubah ketika memetakan ulang tombol panah atas
    Sekarang saya tidak perlu menelusuri semua perintah, hanya mencari perintah yang diawali dengan teks yang sudah saya ketik
    Misalnya setelah mengetik tar - lalu menekan panah atas, opsi tar yang pernah dipakai sebelumnya langsung muncul
    Di zsh bisa diatur seperti ini

    bindkey "^[OA" up-line-or-beginning-search # Up  
    bindkey "^[OB" down-line-or-beginning-search # Down
    
    • Begitu mulai memakai CTRL+r, Anda tidak akan pernah memakai panah atas lagi
    • Menurut saya ini benar-benar game changer. Untuk perilaku serupa di bash, tambahkan ini ke .inputrc
      "\e[A":history-search-backward  
      "\e[B":history-search-forward
      
    • Di fish shell ini adalah perilaku bawaan. Anda bisa menelusuri perintah dengan panah atas/bawah berdasarkan kata yang sudah diketik, dan dengan alt+atas/bawah bahkan bisa menelusuri argumen saja
    • Ini juga bisa diterapkan langsung di .inputrc
    • Saya membiarkan panah atas/bawah apa adanya, dan justru memetakan ctrl+p dan ctrl+n dengan cara ini
  • Mengaktifkan vim-mode di terminal terasa jauh lebih nyaman
    Salah ketik tiga kata sebelumnya? 3bcw selesai
    Hapus seluruh baris dengan cc, dan untuk edit yang rumit bisa langsung dibuka di (neo)vim dengan v
    Kalau Anda memang sudah memakai (neo)vim, ini ideal karena tidak perlu menghafal shortcut baru

    • Ini mengingatkan saya pada satu bagian di manual Emacs lama. Daripada perintah yang rumit, saya ingin merekomendasikan pengaturan mouse
    • Saya sudah memakai (n)vim lebih dari 20 tahun, tapi tidak suka vi-mode di shell. Kalau butuh edit rumit, membuka di neovim dengan ctrl-x+e adalah kompromi yang bagus
    • Saya juga sering memakai vim, tapi tidak di shell. Sebagai gantinya saya memakai shortcut gaya Emacs (ctrl-a, ctrl-e, dll.) di seluruh macOS. Saya berharap vim mendukung binding emacs saat berada di insert mode
    • Baru kali ini saya tahu nama fitur ini adalah “readline vi-mode”. Perlu saya cari tahu lebih lanjut
    • Saya tidak paham kenapa mode emacs jadi bawaan. Setiap membuka shell baru, hal pertama yang saya ketik adalah set -o vi
  • Saya terkesan ada orang yang menaruh skrip bernama \# di PATH supaya bisa mengomentari sebagian pipeline

    #!/bin/sh
    cat
    
    • Saya juga memakai trik serupa. Di file ~/bin/noglob saya taruh
      #!/bin/sh
      $*
      
      begini agar saat memanggil skrip zsh dari bash bisa menghindari konflik noglob
    • Saya memakai komentar dengan tanda kurung. Bagus untuk dokumentasi skrip, tapi merepotkan di shell interaktif. Tetap saja ini cara berkomentar yang kreatif dan menarik
    • Saya penasaran apa kelebihannya dibanding mycmd1 #| mycmd2
    • Ini benar-benar berguna, jadi saya akan menambahkannya ke $PATH saya
  • CTRL+W biasanya menghapus sampai spasi sebelumnya, jadi seluruh /var/log/nginx/ ikut terhapus
    Alt+Backspace menghapus sampai sebelum karakter non-alfabet
    Tapi hati-hati karena ini bisa bentrok dengan shortcut menutup tab browser

    • Mulai Firefox v147 ada fitur untuk mengubah shortcut. Tautan terkait
    • Di macOS masalah seperti ini tidak ada karena shortcut GUI dan shortcut terminal dipisahkan. ⌘C, ⌘W, dll. tetap bekerja sama juga di terminal
    • Di lingkungan saya (fish + Alacritty) justru kebalikannya. Untungnya tab yang tertutup masih bisa dipulihkan dengan Ctrl-Shift-T
    • Jika / dihapus dari pengaturan $WORDCHARS, Anda akan mendapatkan perilaku yang diinginkan (tautan referensi)
    • Tab bisa langsung dipulihkan dengan Ctrl-Shift-T
  • Saya merekomendasikan meningkatkan pencarian riwayat dengan integrasi shell fzf
    Video demo / Dokumentasi resmi

  • Ada satu trik yang sering saya pakai
    Saat sedang mengetik perintah panjang lalu harus mengerjakan hal lain dulu, saya tidak membatalkannya dengan Ctrl-C, melainkan mengubahnya menjadi komentar lalu menjalankannya agar tetap masuk ke riwayat

    $ long_command  
    $ #long_command  
    $ stuff_1  
    $ stuff_2  
    $ #long_command  
    $ long_command
    
    • Di zsh ini bisa dilakukan dengan binding "push-line-or-edit", dan di bash perilaku mirip bisa dibuat dengan C-u lalu C-y
    • Cara yang lebih mudah adalah menyimpan lalu mengosongkan baris saat ini dengan ctrl-u, lalu menempelkannya kembali dengan ctrl-y. Di zsh, proses ini bisa diotomatisasi dengan alt-q
    • Di bash, dengan alt-shift-3 Anda bisa menambahkan # di depan perintah saat ini lalu pindah ke baris baru
  • Judul bergaya LLM kurang menarik, tapi beberapa tip cukup berguna dan ingin saya coba
    Sayang sekali brace expansion tidak terlalu cocok dengan tab completion. Akan bagus jika ada fitur untuk menduplikasi token terakhir atau menghapus ekstensi file

    • Gaya tulisannya sendiri juga terasa seperti LLM. Misalnya kalimat seperti “The shell is a toolbox, not an obstacle course.”
    • PowerShell juga punya mode readline, jadi beban berpindah saat dipakai bersama WSL jadi lebih kecil
    • Karena readline bekerja seperti bagian dari bash, menurut saya wajar kalau tip-tip seperti ini disebut fitur shell
  • Saya memakai fungsi di zsh untuk mengecualikan perintah tertentu dari riwayat
    Misalnya agar perintah berbahaya seperti --force tidak tersimpan di riwayat

    function zshaddhistory() {
      emulate -L zsh
      if ! [[ "$1" =~ "(^ |--force|whatever)" ]] ; then
        print -sr -- "${1%%$'\n'}"
        fc -p
      else
        return 1
      fi
    }
    
    • Saya juga melakukan hal mirip dengan membuat alias yang menambahkan spasi di depan untuk perintah yang tidak ingin dicatat
      unhist () { alias $1=" $1"; }
      unhist unhist
      unhist fzf
      unhist rghist
      
  • Saya memakai snippet di zsh untuk ekspansi otomatis alias global
    Misalnya jika disetel alias -G G='rg -s', maka saat mengetik command | G akan otomatis diperluas menjadi command | rg -s
    Ekspansi terjadi otomatis saat menekan spasi, dan jika diketik sebagai \alias maka ekspansi akan dilewati

  • Ada fungsi “deep cd” buatan saya di .bashrc
    Fungsi ini otomatis berpindah ke direktori pertama yang mengandung string argumen yang diberikan

    dcd() {
      [ -z "$1" ] && return
      local dir
      dir=$(find . -type d -path "*$1*" -print -quit 2>/dev/null)
      [ -n "$dir" ] && cd "$dir"
    }
    

    Awalnya saya kira akan lambat, tapi ternyata lebih sering saya pakai dari dugaan

    • Layak juga melihat alat smart cd seperti autojump jc, z, atau fzf
 
phoon 21 hari lalu

Remapping tombol panah atas di atas itu, pengguna Emacs biasanya cukup pakai c-r. Ujung dari tuning adalah setelan bawaan.