Tüm komutları virgülle başlatın (2009)
(rhodesmill.org)- Unix kullanıcıları kişisel betiklerini
~/bin/dizinine koyupPATH’e eklediğinde, kısa komut adları yeni sistem komutlarıyla çakışabilir - Debian/Ubuntu gibi çok sayıda komut sunan ortamlarda risk daha da artar; örnek Ubuntu dizüstü bilgisayarda
/usr/binkomutlarının sayısı 21.733 olarak hesaplanmış - Kişisel komutların başına virgül (
,değil,,) koymak, kabuk ve araçlar tarafından normal bir dosya adı karakteri olarak işlenirken sistem komutlarından kolayca ayırt edilmelerini sağlar - Virgül Shift kullanmadan yazılabilir ve kabukta güçlü anlamları olan parantez, ters eğik çizgi, iki nokta, backtick, tek tırnak, eğik çizgi ve noktaya göre çakışma olasılığı daha düşüktür
,sonrasında Tab’a basınca kişisel komut listesini hemen gözden geçirebilirsiniz; bu da~/bin/komut adlarını düzenli tutmayı kolaylaştırır
Kişisel komut adları neden çakışır?
- Birçok Unix kullanıcısı ev dizininde
~/bin/oluşturup bunuPATH’e ekleyerek kişisel kolaylık komutları ve kabuk betikleri kullanır - Sorun, kişisel betik adlarının genellikle kısa küçük harf kombinasyonları olması ve bu yüzden varsayılan sistem komutlarına benzeme olasılığının yüksek olmasıdır
- Bir Linux dağıtımı yeni bir komut eklediğinde, mevcut bir kişisel komutla tesadüfen aynı ada sahip olabilir
- Debian türevi ortamlarda sunulan komut sayısı fazla olduğu için bu sorun daha gerçekçi hale gelir
- Örnek Ubuntu dizüstü bilgisayarda
/usr/bindizininin hemen altındaki komutları sayınca21.733sonucu çıkıyor apt-file search -x '^/usr/bin/[^/]*$' | wc -l
- Örnek Ubuntu dizüstü bilgisayarda
Virgül önekinin sağladığı avantajlar
- Çözüm, kişisel komut adlarını hem yazması kolay hem de sistem komutu adı olarak pek seçilmeyecek bir biçime dönüştürmektir
- Yazım kolaylığı için ölçüt Shift tuşunu kullanmamaktır; bu koşulu karşılayıp güvenli olan karakter sayısı çok değildir
- Küçük harfler sistem komutlarında zaten yaygın kullanılır
- Parantezler, ters eğik çizgi, iki nokta, backtick ve tek tırnak kabukta özel anlam taşır
- Eğik çizgi dizin ayırıcıdır, bu yüzden dosya adında yer alamaz
- Nokta, dosya adının başında gizli dosya anlamına gelir; başka konumlarda da uzantı ayırıcı olarak sık kullanılır
- Geriye kalan seçenek basit bir virgüldür (
,); çevredeki araçlar ve kabuk, virgülü dosya adındaki normal bir karakter olarak işler - Her kişisel komuta önek olarak virgül eklemek, onları sistem komutlarından net biçimde ayırır ve ad çakışmalarından kaçınmayı kolaylaştırır
- Tab tamamlama ile birlikte kullanıldığında,
,yazdıktan sonra kişisel komut listesini hemen görebilirsiniz- Örnek listede
,complete-scp,,complete-ssh,,coreoff,,coreon,,find,,go-thpgp,,gr,,hss,,mount-thpgp,,mount-twt,,range,,svn-store-password,,umountgibi komutlar yer alır
- Örnek listede
- Bu yöntem yaklaşık 10 yıldır kullanılıyor ve kişisel
~/bin/komut adlarını temiz ve düzenli tutmanın bir yolu olarak öneriliyor
2 yorum
Hacker News yorumları
Sadece başlığa bakınca berbat bir fikir sanmıştım ama aslında oldukça hoşuma gitti. Özellikle Tab ile tüm araçlarımı listeleme kısmını sevdim.
Son zamanlarda ad alanı çakışmalarıyla pek karşılaşmadım; yönetim tarafına geçtikten sonra teknik sezgilerimin biraz gevşediği de doğru. Teknoloji yığınımın yaklaşık 10 yıl eskimiş gibi hissettirdiğini düşünüyorum; yeniden güncel hissiyatı yakalamak için nereden başlamak iyi olur merak ediyorum.
Benim yöntemim, hayatımı kolaylaştıran araçları kendim yapmak. Örneğin şirkette basit sorgulamalar için sık kullandığım bir web servisi varsa API’si var mı diye bakıyorum ve günlük işleri hızlandırmak için CLI yazıyorum. İstediğim gibi cilaladıktan sonra ekiple paylaşıyorum ama başkalarını denemeye ikna etmek zor oluyor. Yine de her gün ben kullandığım için bunu çok dert etmiyorum.
Amacım yeni bir bakış açısı görmek ve trendler hakkında konuşabilmekti; bunların bir kısmı artık işe de taşındı. Bu sayede eski bileşenleri de daha derinlemesine anlamış oldum.
Bu sorunu pek anlamıyorum. Kendi
bindizinimi$PATH’in sonuna değil başına koyarım, olur biter. Kendi komutlarıma göz atmak için de sadecels ~/binçalıştırırım.$0’ın sistem yolunda olduğunu varsayar, bu bozulur ve can sıkıcı bir hata ayıklama süreci başlar.Sonuçta hangi zehri seçeceğin meselesi.
fzfotomatik tamamlamasını kullanabilmek. Örneğin fish’te komutun ilk karakterini yazıp Tab’a basarakfzf’yi açabilirsin.Böylece sadece
,+Tab ile kullanıcı tanımlı komutları hızlıca süzebilirsin. Buna karşılıkls ~/bin, sık yapılan bir iş için yazılacak karakter sayısı fazla; ya da önce otomatik tamamlamayı bulmak içinls+yukarı ok tuşuna birkaç kez basman gerekebilir.ls ~/binyazmak,yazmaktan çok daha yavaş.Ben
gitiçin ince bir sarmalayıcıdaaa,st,di,dp,cm,legibi kısa kullanıcı tanımlı komut adları kullanıyorum.Bunlardan biri bazı sistemlerde varsayılan kurulu gelen bir yardımcı programla gerçekten çakışıyor. Yine de benim
bindizinim$PATH’te sistem dizinlerinden önce olduğu için benimki kazanıyor ve çakışan o araca pek ilgi duymuyorum. Bana faydalı başka bir araç benim aracımla çakışırsa, kendi aracımın adını değiştirmektense muhtemelen o diğer araca çakışmayan bir takma ad veririm. Bu iki harfli araçlar fazla kullanışlı.apt-get upgrade’in Dwarf Fortress çalıştırması gibi sorunlara yol açabilir.https://askubuntu.com/questions/938606/dwarf-fortress-starti...
gittakma adlarım geneldegile başlayan iki harfli kombinasyonlardan oluşuyor. Örneğings,git statusdemek.Ama bazen gerçekten GhostScript’e ihtiyaç duyduğum oluyor. PDF dosyalarına yazı tipi gömmek gibi durumlarda harika iş çıkarıyor. Genelde o zaman
env gskullanıyorum.jile başlıyor.javaortaya çıktığında işler epey eğlenceli hale geldi. Virgül kullanmak oldukça ilginç bir fikir.Yine de
kile başlamadığı iyi olmuş, KDE yüzünden :)Örneğin
mkfsbencesys::mkfsgibi çağrılmalı. Sistem komutlarıyla kullanıcı komutlarını ayıran çizgi çeşitli şekillerde tanımlanabilir ve gri alanlar da olur; ama kullanıcı, varlığını bile bilmediği ve açıkça kurmadığı bir komutu yanlışlıkla çalıştırabiliyorsa, o komut doğrudan küresel ad alanına açık olmamalı.İlgili bir soru var
Çoğunlukla Windows kullanıyorum ve yazar gibi Python ağırlıklı birkaç CLI betiği oluşturup
~/bin/karşılığı bir yere koyuyorum.python.exeyi.pyuzantısının varsayılan programı olarak ayarlayıp.pyyi%pathext%e ekleyince, herhangi bir dizinden sadecehelloyazarak~/bin/hello.pyyi çalıştırabiliyorum ve bunu günde yüzlerce kez kullanıyorum. Son zamanlarda Linux’u daha çok kullanıyorum ama hâlâ acemi olduğum için aynı şekilde yapamadım. Linux’ta “ilişkilendirilmiş program” kavramı yok gibi; bu yüzden.pydosyasını doğrudan çağırıp kabuğun bunu Python ile çalıştırmasını sağlayamıyorum. Elbette betiğechmod +xverebilirim, ama o zaman betiğin içine shebang koymam gerekiyor; bu da hardcode edilmiş gibi hissettirdiği için rahatsız ediyor. İleride.pybetiklerini/usr/bin/pythonyerine/usr/bin/nohtypile çalıştırmak istersem ne olacak diye düşünüyorum. Üstelik betiği çağırırken.pykısmını atlamanın bir yolunu da bulamadım. Linux tasarımını eleştirmeye çalışmıyorum; pek çok avantajı olduğunu biliyorum, ama gerçekten$PATHiçindekihello.pyyihelloolarak çalıştırmak istiyorummy_pythonadlı bir sembolik bağlantı bulundurup shebang’i/usr/bin/env my_pythonolarak yazabilirsinizDaha ilkeli bir yaklaşım isterseniz
update-alternativesaracına bakabilirsiniz. Bu tür soyutlamayı daha genel biçimde sağlar: https://linuxconfig.org/how-to-set-default-programs-using-up...Linux’ta, aslında Windows dışındaki çoğu platformda dosya uzantılarının anlamı çok daha zayıftır. Herhangi bir tür yürütülebilir dosyanın çalıştırılabilir olup olmadığı uzantıya göre değil,
+xbayrağı gibi şeylere göre belirlenir. Bu sayede uygulama dilini değiştirseniz bile çağıran tarafı bozmadan yeniden yazabilirsiniz..pyuzantısı ancak içe aktarılıp kullanılan modüller için anlamlıdır; çalıştırılan bir betikse gerektiğinde shebang’e bakılır. Dışarı dağıtılan betikler genelde#!/usr/bin/env pythonkullanır, dağıtım paketlerine dahil betiklerin shebang’i ise#!/usr/bin/pythonvb. ile değiştirilir. Ayrıca shebang birden fazla argümanı desteklemez, ancak GNUenvbunu taklit edebilen-Sargümanını destekler. Yine de argüman uzunluğu sorunu kalır.pyyi çıkarın yeter. Ona"hello"demek tamamen sorun değilShebang’in aklıma gelen pek bir dezavantajı yok. Gerçekten farklı bir yorumlayıcıyla çalıştırmak istiyorsanız
"nohtyp hello"diye açıkça belirtebilirsiniz. Yine de çok rahatsız ediyorsa kabuk başlangıç dosyanızda bir alias tanımlayabilirsiniz. Örneğin bash’tealias hello="python3 /path/to/hello.py"yapabilirsiniz. İsterseniz belirli bir dizinin içeriği için bu tür alias’ları otomatik oluşturan kısa bir betik de yazabilirsinizKabuk betiklerinde genellikle shebang eklenir ve dosya çalıştırılabilir yapılır; böylece çalıştırılacak program betiğin içinde bildirilmiş olur. Shebang’i bir tür dosya uzantısı gibi düşünebilirsiniz.
chmod +x ./malware.pysonrası./malware.pyçalışmıyorsa shebang’in işaret ettiği yolu kontrol etmek gerekir. Yorumlayıcı betiği normal bir argüman olarak çalıştırabiliyorsaxdg-open malware.pygibi bir yöntemle de benzer davranış elde edilebilir. Bu, varsayılan dosya yöneticisinde çift tıklamakla aynı şey olur. Linux’u ana masaüstü işletim sistemi olarak kullandığım dönemdexopadlı bir alias’ım vardı, ama bunu yalnızca varsayılan davranışı zaten doğru olan resim veya belge gibi veri dosyalarında kullanıyordum. Çalıştırılabilir betiklerin varsayılan programını yorumlayıcı olarak ayarlamayı önermem. Varsayılan olarak betikleri çalıştırmak yerine bir düzenleyicide açmak isteyebilirsiniz.xdg-openun Gnome tarafına ait bir araç olduğunu düşünüyorum; ama bu başka masaüstlerinde kullanılamaz demek değil, Xubuntu’da da kullanmıştım. Gerçekten tüm Python dosyalarını GUI bağlamında da varsayılan olarak çalıştırmak istiyorsanız böyle bir varsayılan ayarlayabilirsiniz;man xdg-openyardımcı olabilir. Tekrar söyleyeyim, bu iyi bir tavsiye değil#!/usr/bin/env pythonşeklindedirBöylece yolda ilk bulunan
pythonçalıştırılır. İleride/usr/bin/pythonyerine/usr/bin/nohtypile çalıştırmak isterseniz,/usr/binden önce aranan bir dizinde/usr/bin/nohtypi gösteren birpythonsembolik bağlantısı oluşturabilirsiniz. Örneğin~/myCommandPreferencesi$PATHin başına ekleyebilirsiniz$PATHçakışmalarından kaçınmanın başka bir yolu, başka yürütülebilir dosyaların kullanma olasılığı düşük olan çok uzun bir yürütülebilir dosya adı oluşturupbashrcye kısa bir alias koymaktırAlias, betik içinde çağrılan yürütülebilir dosyaları etkilemez; kendi betiklerimde uzun adla referans vermeye devam edebilirim. Dezavantajı aynı düzeyde Tab otomatik tamamlama kullanılabilirliği sağlamaması; o kısım gerçekten güzel. Ayrıca Python’ın
venvetkinleştirme betiği gibi alt süreç olarak çalıştırılmayıpsourceedilmesi gereken betiklerde hâlâ çakışma olabilir, ama bu tür durumlar nadirdirzshte o otomatik tamamlama da çalışıyorVirgülle başlatma yöntemi metin genişletici/metin değiştirme topluluklarında da yaygın bir tekniktir
,ile başlıyorGeçenlerde
~/.local/bin/içine bakarken, koyduğumu hatırlamadığım onlarca yürütülebilir dosya olduğunu fark ettimÇoğu pyside ile ilgiliydi ama başka betikler de vardı. Hangi betiği kendim yazdım, hangisi başkasının yaptığıydı hatırlamak için tek tek açmam gerekti. Kendi betiklerimin adını virgülle başlatmış olsaydım çok daha hızlı olurdu; ayrıca her betiği neden oluşturduğumu açmadan önce hatırlamama da yardımcı olurdu
~/.local/bin/kurulu betikler içindir; yerelde bizzat yazdıklarım ise~/bin/altında dururReddederim. Kişisel
bindizinimi$PATH'in başına koyar, gölgede kalan programlara başvururken/usr/binveya/binkullanırımKişiselleştirilmiş araç listesini
~/bin/[Tab]ile listeleyebilirimSistemin
grepinden, örneğin Solarisgrepinden hoşlanmıyor ve tercih ettiğim GNUgrepi kullanmak istiyorsam, neden onu doğrudangrepolarak bırakmayayım?Bu fikirle 5 yıl önce karşılaşmam, kabuk ipuçları koleksiyonuma düzen getirdi. Takma adlar ve
~/binbirleşince 50'den fazla virgül komutu var ve kabukla hayatım eski karmaşık hâline göre çok daha akıcı oldu2020'de de tartışılmıştı: https://news.ycombinator.com/item?id=22778988 (90 yorum)
, macroexpandsonucu da varTüm komutlarınızı virgülle başlatın (2009) - https://news.ycombinator.com/item?id=31846902 - Haziran 2022 (121 yorum)
Tüm komutlarınızı virgülle başlatın (2009) - https://news.ycombinator.com/item?id=22778988 - Nisan 2020 (89 yorum)
_kullanmak nasıl olur?