2 poin oleh GN⁺ 2024-06-24 | 2 komentar | Bagikan ke WhatsApp
  • Pengguna Unix sering menaruh skrip pribadi di ~/bin/ lalu menambahkannya ke PATH, tetapi nama perintah yang pendek bisa bertabrakan dengan perintah sistem baru
  • Di lingkungan dengan banyak perintah bawaan seperti Debian/Ubuntu, risikonya makin besar; pada laptop Ubuntu contoh, jumlah perintah di /usr/bin tercatat 21.733
  • Jika perintah pribadi diawali koma (,), shell dan alat lain akan memperlakukannya sebagai karakter nama berkas biasa, namun tetap mudah dibedakan dari perintah sistem
  • Koma bisa diketik tanpa Shift, dan dibanding tanda kurung, backslash, titik dua, backtick, tanda kutip tunggal, garis miring, atau titik yang punya makna kuat di shell, peluang benturannya lebih kecil
  • Menekan Tab setelah , memungkinkan Anda langsung menelusuri daftar perintah pribadi, sehingga nama perintah di ~/bin/ lebih mudah dijaga tetap rapi

Mengapa nama perintah pribadi bisa bertabrakan

  • Banyak pengguna Unix membuat ~/bin/ di direktori home lalu menambahkannya ke PATH untuk memakai perintah praktis dan skrip shell pribadi
  • Masalahnya, nama skrip pribadi biasanya berupa kombinasi huruf kecil yang pendek sehingga mudah mirip dengan perintah sistem bawaan
  • Saat distribusi Linux menambahkan perintah baru, nama itu bisa saja kebetulan sama dengan perintah pribadi yang sudah ada
  • Di lingkungan turunan Debian, jumlah perintah yang disediakan sangat banyak sehingga masalah ini terasa lebih nyata
    • Pada laptop Ubuntu contoh, menghitung jumlah perintah tepat di bawah /usr/bin menghasilkan 21,733
    • apt-file search -x '^/usr/bin/[^/]*$' | wc -l

Keuntungan awalan koma

  • Solusinya adalah mengubah nama perintah pribadi menjadi bentuk yang tetap mudah diketik tetapi kecil kemungkinannya dipilih sebagai nama perintah sistem
  • Ukuran kemudahan mengetik di sini adalah tidak perlu memakai tombol Shift, dan tidak banyak karakter aman yang memenuhi syarat ini
    • Huruf kecil sudah umum dipakai dalam perintah sistem
    • Tanda kurung, backslash, titik dua, backtick, dan tanda kutip tunggal punya arti khusus di shell
    • Garis miring adalah pemisah direktori sehingga tidak bisa dipakai dalam nama berkas
    • Titik di awal nama berkas berarti berkas tersembunyi, dan di posisi lain juga sering dipakai untuk memisahkan ekstensi
  • Pilihan yang tersisa adalah koma (,) yang sederhana, dan alat sekitar maupun shell memperlakukannya sebagai karakter biasa di dalam nama berkas
  • Jika setiap perintah pribadi diberi awalan koma, perintah itu jadi jelas berbeda dari perintah sistem sehingga benturan nama lebih mudah dihindari
  • Jika dipakai bersama pelengkapan Tab, Anda bisa mengetik , lalu langsung melihat daftar perintah pribadi
    • Daftar contohnya mencakup ,complete-scp, ,complete-ssh, ,coreoff, ,coreon, ,find, ,go-thpgp, ,gr, ,hss, ,mount-thpgp, ,mount-twt, ,range, ,svn-store-password, ,umount, dan lain-lain
  • Pendekatan ini telah dipakai selama sekitar 10 tahun dan direkomendasikan sebagai cara menjaga nama perintah pribadi di ~/bin/ tetap bersih dan tertata

2 komentar

 
GN⁺ 2024-06-24
Opini Hacker News
  • Saat hanya melihat judulnya, kupikir ini ide yang buruk sekali, tapi ternyata aku cukup menyukainya. Terutama bagian yang menampilkan semua tool-ku dengan tab
    Belakangan ini aku tidak banyak mengalami tabrakan namespace, dan memang benar setelah pindah ke posisi manajemen, kepekaan teknisku agak mengendur. Tech stack-ku terasa sekitar 10 tahun ketinggalan zaman, jadi aku penasaran sebaiknya mulai dari mana untuk mengejar kembali perkembangan terbaru

    • Cara keren zaman sekarang sepertinya adalah membuat sesuatu sendiri di waktu luang, lalu belajar secara alami dalam proses pembuatannya. Kemandirian, kreativitas, dan sikap memulai sendiri adalah nuansa zaman sekarang; makin banyak yang dibuat, makin besar motivasi untuk menemukan sendiri kiat menyelesaikan masalah nyata dan solusi yang modern
    • Aku juga di sisi manajemen, dan merasa kemampuan teknis bisa menurun kalau tidak terus mengikuti
      Caraku adalah membuat sendiri tool yang memudahkan hidupku. Misalnya, kalau di perusahaan ada layanan web yang sering dipakai untuk kueri sederhana, aku mencari apakah ada API-nya, lalu menulis CLI agar pekerjaan sehari-hari lebih cepat. Setelah kupoles sampai sesuai selera, aku membagikannya ke tim, tapi ternyata sulit meyakinkan orang lain untuk mencobanya. Meski begitu, karena aku memakainya setiap hari, aku tidak terlalu mempermasalahkannya
    • Untuk alasan yang sama, aku membuat side project dengan stack terpisah yang lebih populer, bukan stack yang biasa kupakai di pekerjaan
      Tujuannya adalah melihat perspektif baru dan bisa berbicara tentang tren, dan sebagian di antaranya kini sudah terbawa ke pekerjaan. Berkat itu, aku juga jadi memahami komponen-komponen lama dengan lebih mendalam
  • Aku tidak begitu paham masalah ini. Cukup taruh direktori bin milikku di awal $PATH, bukan di akhir. Untuk melihat-lihat perintahku, aku tinggal menjalankan ls ~/bin

    • Lalu bisa saja ada tool yang mengharapkan $0 berada di path sistem, dan ketika itu rusak, debugging yang menjengkelkan pun dimulai
      Pada akhirnya ini soal memilih racun yang mana
    • Bukankah cukup mengingat nama yang kuberikan sendiri? Aku tidak mengerti kenapa ini dianggap semacam hack
    • Salah satu kelebihannya adalah bisa memakai autocomplete fzf. Misalnya di fish, kamu bisa mengetik huruf pertama perintah lalu menekan Tab untuk memunculkan fzf
      Dengan begitu, hanya dengan ,+Tab kamu bisa menyaring perintah kustom dengan cepat. Sebaliknya, ls ~/bin cukup banyak karakter yang harus diketik untuk sesuatu yang sering dilakukan, atau kamu mungkin harus mencari autocomplete lebih dulu dengan ls+panah atas beberapa kali
    • ls ~/bin jauh lebih lambat diketik daripada ,
  • Aku memakai nama perintah kustom pendek seperti aa, st, di, dp, cm, le untuk wrapper tipis di atas git
    Salah satunya benar-benar bertabrakan dengan utilitas yang terpasang secara default di suatu sistem. Tapi karena direktori bin milikku berada lebih depan di $PATH daripada direktori sistem, milikku yang menang, dan aku tidak terlalu peduli pada tool yang bertabrakan itu. Kalau ada tool lain yang berguna bagiku bertabrakan dengan tool-ku, kemungkinan aku akan memberi alias yang tidak bertabrakan pada tool lain itu, alih-alih mengganti nama tool-ku. Tool dua huruf ini terlalu nyaman

    • Cara seperti ini bisa berujung pada masalah semacam apt-get upgrade menjalankan Dwarf Fortress
      https://askubuntu.com/questions/938606/dwarf-fortress-starti...
    • Benar. Nama 1–3 huruf sebaiknya disisakan untuk alias, fungsi, skrip pengguna, dan utilitas standar
    • Alias git milikku umumnya kubuat sebagai kombinasi dua huruf yang diawali g. Misalnya gs adalah git status
      Tapi sesekali aku benar-benar membutuhkan GhostScript. Sangat bagus untuk hal seperti menyematkan font ke file PDF. Biasanya dalam kasus begitu aku memakai env gs
    • Semua perintah pribadiku diawali j. Saat java muncul, itu jadi cukup lucu. Memakai koma adalah ide yang cukup menarik
      Tapi untung saja aku tidak memulainya dengan k, karena KDE :)
    • Ini pendapat yang agak kuat, tapi menurutku perintah sistem tidak boleh semudah itu diakses seperti perintah pengguna. Harus ada namespace dalam bentuk apa pun
      Misalnya, menurutku mkfs seharusnya dipanggil seperti sys::mkfs. Garis pemisah antara perintah sistem dan perintah pengguna bisa didefinisikan dengan berbagai cara, dan akan ada bagian yang ambigu, tetapi jika pengguna bisa secara tidak sengaja menjalankan perintah yang mereka bahkan tidak tahu keberadaannya dan tidak pernah mereka instal secara eksplisit, maka perintah itu tidak boleh langsung terekspos di namespace global
  • Ada pertanyaan terkait
    Saya sebagian besar memakai Windows, dan seperti penulis, saya membuat beberapa skrip CLI yang berpusat pada Python lalu menaruhnya di tempat yang setara dengan ~/bin/. Jika python.exe ditetapkan sebagai program default untuk ekstensi .py dan .py ditambahkan ke %pathext%, dari direktori mana pun saya bisa menjalankan ~/bin/hello.py hanya dengan mengetik hello, dan saya memakainya ratusan kali sehari. Belakangan saya lebih banyak memakai Linux, tetapi masih pemula sehingga belum bisa membuatnya dengan cara yang sama. Sepertinya di Linux tidak ada konsep “program terkait”, jadi tidak bisa begitu saja memanggil file .py dan membuat shell menjalankannya dengan Python. Tentu saja skrip bisa diberi chmod +x, tetapi itu berarti harus memasukkan shebang ke skrip itu sendiri, yang terasa seperti hardcoding dan membuat saya kurang nyaman. Bagaimana kalau nanti saya ingin menjalankan skrip .py dengan /usr/bin/nohtyp alih-alih /usr/bin/python? Selain itu, saya juga belum menemukan cara untuk menghilangkan bagian .py saat memanggil skrip. Saya tidak bermaksud mengkritik desain Linux, dan saya tahu ada banyak kelebihannya, tetapi saya benar-benar ingin menjalankan hello.py yang ada di $PATH sebagai hello

    • Di Linux, saya tetap menganggap shebang adalah alat yang tepat untuk masalah ini. Kalau ingin cara ringan, letakkan symlink my_python di dalam path, lalu tulis shebang sebagai /usr/bin/env my_python
      Jika ingin pendekatan yang lebih prinsipil, lihat tool update-alternatives. Tool ini menyediakan abstraksi semacam ini secara lebih umum: https://linuxconfig.org/how-to-set-default-programs-using-up...
    • Solusinya sudah disebutkan orang lain, tetapi saya ingin menambahkan satu alasan mengapa begitu
      Di Linux, dan sebenarnya di sebagian besar platform selain Windows, makna ekstensi file jauh lebih lemah. Apakah suatu file bisa dieksekusi atau tidak ditentukan oleh flag +x dan sejenisnya, bukan oleh ekstensinya. Berkat itu, Anda bisa mengganti bahasa implementasi dan menulis ulang tanpa merusak sisi pemanggil. Ekstensi .py hanya bermakna untuk modul yang diimpor dan dipakai; kalau itu skrip yang dijalankan, lihat shebang bila diperlukan. Skrip yang didistribusikan secara eksternal biasanya memakai #!/usr/bin/env python, sementara skrip yang termasuk dalam paket distro akan ditimpa menjadi #!/usr/bin/python atau semacamnya. Selain itu, shebang tidak mendukung banyak argumen, tetapi GNU env mendukung argumen -S yang bisa menirunya. Namun masalah panjang argumen tetap ada
    • Cukup hapus .py dari nama file. Menamainya "hello" benar-benar tidak masalah
      Saya tidak terpikir banyak kekurangan shebang. Kalau benar-benar ingin menjalankannya dengan interpreter lain, tulis saja secara eksplisit seperti "nohtyp hello". Kalau itu tetap terasa mengganggu, Anda bisa mendefinisikan alias di file startup shell. Misalnya di bash bisa seperti alias hello="python3 /path/to/hello.py". Kalau mau, Anda juga bisa menulis skrip pendek yang otomatis membuat alias semacam ini untuk isi direktori tertentu
    • Konsep seperti itu memang ada, tetapi tidak berada di dalam sintaks shell. Biasanya ini adalah masalah tingkat aplikasi yang diserahkan ke desktop/GUI
      Dalam skrip shell, biasanya kita menambahkan shebang dan membuat file bisa dieksekusi, sehingga executable dideklarasikan di dalam skrip itu sendiri. Anggap saja shebang sebagai semacam ekstensi file. Setelah chmod +x ./malware.py, jika ./malware.py tidak berjalan, periksa path yang ditunjuk shebang. Jika interpreter bisa menjalankan skrip sebagai argumen biasa, perilaku serupa juga bisa dibuat dengan cara seperti xdg-open malware.py. Itu kira-kira sama seperti mengklik dua kali di file manager default. Saat memakai Linux sebagai OS desktop utama, saya pernah membuat alias bernama xop, tetapi hanya saya pakai untuk file data seperti gambar atau dokumen yang perilaku default-nya memang sudah tepat. Saya tidak menyarankan menetapkan program default untuk skrip executable ke interpreter. Secara default, mungkin Anda ingin membuka skrip di editor, bukan menjalankannya. Saya menganggap xdg-open sebagai tool dari sisi Gnome, tetapi bukan berarti tidak bisa dipakai di desktop lain; saya juga pernah memakainya di Xubuntu. Jika benar-benar ingin semua file Python dijalankan secara default juga dalam konteks GUI, default semacam itu bisa diatur, tetapi man xdg-open mungkin membantu. Sekali lagi, ini bukan saran yang baik
    • Ini tidak langsung mencapai tujuan Anda, tetapi shebang hanya setengah hardcoding. Cara yang “benar” memakai shebang, meski ada beberapa catatan seperti bisa dilihat di https://unix.stackexchange.com/a/29620, adalah #!/usr/bin/env python
      Dengan begitu, python pertama yang ditemukan di path akan dijalankan. Jika nanti Anda ingin menjalankannya dengan /usr/bin/nohtyp alih-alih /usr/bin/python, Anda bisa membuat symlink bernama python yang menunjuk ke /usr/bin/nohtyp di direktori yang dicari sebelum /usr/bin. Misalnya, tambahkan ~/myCommandPreferences di depan $PATH
  • Cara lain untuk menghindari bentrokan $PATH adalah membuat nama executable yang sangat panjang dan kecil kemungkinan dipakai executable lain, lalu menaruh alias pendek di bashrc
    Alias tidak memengaruhi executable yang dipanggil dari dalam skrip, dan di skrip saya sendiri saya tetap bisa merujuknya dengan nama panjang. Kekurangannya adalah usability autocomplete dengan tombol Tab tidak berada di level yang sama, meski bagian itu memang sangat keren. Selain itu, pada skrip yang harus di-source dan bukan dijalankan sebagai subprocess, seperti skrip aktivasi venv milik Python, bentrokan tetap bisa terjadi, tetapi kasus seperti itu jarang

    • Di zsh, autocomplete itu juga bisa
  • Cara memulai dengan koma juga merupakan teknik umum di komunitas text expander/substitusi teks

    • Benar. Sebagian besar alias vim saya juga dimulai dengan ,
  • Baru-baru ini saya melihat-lihat ~/.local/bin/ dan menemukan puluhan executable yang saya tidak ingat pernah memasukkannya
    Sebagian besar terkait pyside, tetapi ada juga skrip lain. Saya harus membukanya satu per satu untuk mengingat mana skrip yang saya tulis sendiri dan mana yang dibuat orang lain. Kalau nama skrip saya diawali koma, itu akan jauh lebih cepat, dan juga akan membantu saya mengingat sebelum membukanya mengapa setiap skrip itu saya buat

    • Biasanya ~/.local/bin/ dipakai untuk skrip yang terinstal, sedangkan yang ditulis sendiri secara lokal ditaruh di ~/bin/
  • Saya menolak. Cukup letakkan bin pribadi di depan $PATH, lalu saat merujuk program yang tertutupi gunakan /usr/bin atau /bin
    Daftar tool yang dipersonalisasi bisa ditampilkan dengan ~/bin/[Tab]

    • Saya tidak mengerti mengapa harus terus mengingat koma, karena saya tidak ingin menimpa utilitas sistem dengan milik saya sambil tetap memakai nama yang sama
      Kalau saya tidak suka grep bawaan sistem, misalnya grep di Solaris, dan ingin memakai GNU grep yang saya sukai, kenapa tidak membiarkannya saja bernama grep?
  • Menemukan ide ini 5 tahun lalu membantu saya menata kumpulan trik shell saya. Gabungan alias dan ~/bin saya sekarang punya lebih dari 50 perintah koma, dan kehidupan di shell jadi jauh lebih lancar daripada keadaan lama yang berantakan

  • Pernah dibahas juga pada 2020: https://news.ycombinator.com/item?id=22778988 (90 komentar)

 
kayws426 2024-06-24

Bagaimana kalau menggunakan '_'?