- Pengguna Unix sering menaruh skrip pribadi di
~/bin/lalu menambahkannya kePATH, 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/bintercatat 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 kePATHuntuk 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/binmenghasilkan21,733 apt-file search -x '^/usr/bin/[^/]*$' | wc -l
- Pada laptop Ubuntu contoh, menghitung jumlah perintah tepat di bawah
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
- Daftar contohnya mencakup
- Pendekatan ini telah dipakai selama sekitar 10 tahun dan direkomendasikan sebagai cara menjaga nama perintah pribadi di
~/bin/tetap bersih dan tertata
2 komentar
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
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
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
binmilikku di awal$PATH, bukan di akhir. Untuk melihat-lihat perintahku, aku tinggal menjalankanls ~/bin$0berada di path sistem, dan ketika itu rusak, debugging yang menjengkelkan pun dimulaiPada akhirnya ini soal memilih racun yang mana
fzf. Misalnya di fish, kamu bisa mengetik huruf pertama perintah lalu menekan Tab untuk memunculkanfzfDengan begitu, hanya dengan
,+Tab kamu bisa menyaring perintah kustom dengan cepat. Sebaliknya,ls ~/bincukup banyak karakter yang harus diketik untuk sesuatu yang sering dilakukan, atau kamu mungkin harus mencari autocomplete lebih dulu denganls+panah atas beberapa kalils ~/binjauh lebih lambat diketik daripada,Aku memakai nama perintah kustom pendek seperti
aa,st,di,dp,cm,leuntuk wrapper tipis di atasgitSalah satunya benar-benar bertabrakan dengan utilitas yang terpasang secara default di suatu sistem. Tapi karena direktori
binmilikku berada lebih depan di$PATHdaripada 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 nyamanapt-get upgrademenjalankan Dwarf Fortresshttps://askubuntu.com/questions/938606/dwarf-fortress-starti...
gitmilikku umumnya kubuat sebagai kombinasi dua huruf yang diawalig. Misalnyagsadalahgit statusTapi sesekali aku benar-benar membutuhkan GhostScript. Sangat bagus untuk hal seperti menyematkan font ke file PDF. Biasanya dalam kasus begitu aku memakai
env gsj. Saatjavamuncul, itu jadi cukup lucu. Memakai koma adalah ide yang cukup menarikTapi untung saja aku tidak memulainya dengan
k, karena KDE :)Misalnya, menurutku
mkfsseharusnya dipanggil sepertisys::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 globalAda 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/. Jikapython.exeditetapkan sebagai program default untuk ekstensi.pydan.pyditambahkan ke%pathext%, dari direktori mana pun saya bisa menjalankan~/bin/hello.pyhanya dengan mengetikhello, 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.pydan membuat shell menjalankannya dengan Python. Tentu saja skrip bisa diberichmod +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.pydengan/usr/bin/nohtypalih-alih/usr/bin/python? Selain itu, saya juga belum menemukan cara untuk menghilangkan bagian.pysaat memanggil skrip. Saya tidak bermaksud mengkritik desain Linux, dan saya tahu ada banyak kelebihannya, tetapi saya benar-benar ingin menjalankanhello.pyyang ada di$PATHsebagaihellomy_pythondi dalam path, lalu tulis shebang sebagai/usr/bin/env my_pythonJika 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...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
+xdan sejenisnya, bukan oleh ekstensinya. Berkat itu, Anda bisa mengganti bahasa implementasi dan menulis ulang tanpa merusak sisi pemanggil. Ekstensi.pyhanya 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/pythonatau semacamnya. Selain itu, shebang tidak mendukung banyak argumen, tetapi GNUenvmendukung argumen-Syang bisa menirunya. Namun masalah panjang argumen tetap ada.pydari nama file. Menamainya"hello"benar-benar tidak masalahSaya 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 sepertialias hello="python3 /path/to/hello.py". Kalau mau, Anda juga bisa menulis skrip pendek yang otomatis membuat alias semacam ini untuk isi direktori tertentuDalam 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.pytidak berjalan, periksa path yang ditunjuk shebang. Jika interpreter bisa menjalankan skrip sebagai argumen biasa, perilaku serupa juga bisa dibuat dengan cara sepertixdg-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 bernamaxop, 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 menganggapxdg-opensebagai 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, tetapiman xdg-openmungkin membantu. Sekali lagi, ini bukan saran yang baik#!/usr/bin/env pythonDengan begitu,
pythonpertama yang ditemukan di path akan dijalankan. Jika nanti Anda ingin menjalankannya dengan/usr/bin/nohtypalih-alih/usr/bin/python, Anda bisa membuat symlink bernamapythonyang menunjuk ke/usr/bin/nohtypdi direktori yang dicari sebelum/usr/bin. Misalnya, tambahkan~/myCommandPreferencesdi depan$PATHCara lain untuk menghindari bentrokan
$PATHadalah membuat nama executable yang sangat panjang dan kecil kemungkinan dipakai executable lain, lalu menaruh alias pendek dibashrcAlias 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-
sourcedan bukan dijalankan sebagai subprocess, seperti skrip aktivasivenvmilik Python, bentrokan tetap bisa terjadi, tetapi kasus seperti itu jarangzsh, autocomplete itu juga bisaCara memulai dengan koma juga merupakan teknik umum di komunitas text expander/substitusi teks
,Baru-baru ini saya melihat-lihat
~/.local/bin/dan menemukan puluhan executable yang saya tidak ingat pernah memasukkannyaSebagian 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
~/.local/bin/dipakai untuk skrip yang terinstal, sedangkan yang ditulis sendiri secara lokal ditaruh di~/bin/Saya menolak. Cukup letakkan
binpribadi di depan$PATH, lalu saat merujuk program yang tertutupi gunakan/usr/binatau/binDaftar tool yang dipersonalisasi bisa ditampilkan dengan
~/bin/[Tab]Kalau saya tidak suka
grepbawaan sistem, misalnyagrepdi Solaris, dan ingin memakai GNUgrepyang saya sukai, kenapa tidak membiarkannya saja bernamagrep?Menemukan ide ini 5 tahun lalu membantu saya menata kumpulan trik shell saya. Gabungan alias dan
~/binsaya sekarang punya lebih dari 50 perintah koma, dan kehidupan di shell jadi jauh lebih lancar daripada keadaan lama yang berantakanPernah dibahas juga pada 2020: https://news.ycombinator.com/item?id=22778988 (90 komentar)
, macroexpandStart all of your commands with a comma (2009) - https://news.ycombinator.com/item?id=31846902 - Juni 2022 (121 komentar)
Start all of your commands with a comma (2009) - https://news.ycombinator.com/item?id=22778988 - April 2020 (89 komentar)
Bagaimana kalau menggunakan
'_'?