Tüm scriptlerime * .sh ve * .rb dosya uzantısını koymalı mıyım?


20

$ HOME / bin dizininde el ile çalıştırılabilir çalıştırılabilir komut dosyaları var. Bazıları bash, bazıları Ruby'de yazılmıştır. Hepsinde en üstte shebang hattı var ve kabuğa hangi tercümanın kullanılacağını söylüyor (bash veya Ruby, benim durumumda).

Hangi komut dosyasında yazıldığını belirtmek için bu komut dosyalarına dosya uzantıları koymak daha iyi olabilir mi? Örneğin, Ruby'deki komut dosyaları * .rb sonekine sahip olacaktı ve bash olanlar * .sh sonekine sahip olacaktı.

Şu anda, bu komut dosyalarının yalnızca dosya uzantısı olmayan basit adları vardır.

En iyi uygulama nedir?


1
Shebang'dan eklentiye dönüştürmek ve basit bir komut dosyası ile geri dönüştürmek kolaydır. Birini deneyin ve gerekirse düzeltin.
Aaron J Lang

Yanıtlar:


9

Gibi joker komutları yapabilirsiniz ls *.rbveya cp *.shgelecekte komut dosyalarını düzenlemek istiyorsanız.

Bence erken başla ya da pişman ol.

Gibi editörler shebang veya dosya uzantısı vimdayalı doğru sözdizimi vurgulama uygulamak mümkün olacak .

Bu, çeşitli editörlerde modellerin kullanılmasıyla da gerçekleştirilebilir. Örneğin vim için:

# vim: ft=sh

2
IMHO, organizasyonun uygulama detaylarıyla değil, fonksiyonla daha iyi yapıldığını belirtti.
Grawity

4
@grawity: Bununla birlikte, shebang için grepping daha basit bir sonek tarafından organize ediyor ...
akira

Glob nedeni ile aynı fikirde olsam da, çoğu editör filo türünü belirlemek için shebang'ı okuyacak kadar akıllıdır.
Rich Homolka

10

Şey - hayattaki çoğu şey gibi: Bu sizin ihtiyaçlarınıza bağlıdır.

Bu komut dosyalarının bir bin dizininde bulunduğunu ve bu komut dosyalarının komut satırından çağrılacağını varsayıyorsunuz. Gibi kullanıcı Ben bla.ksh veya foo.bash yazmak zorunda olmadığını rahatsız edici olarak değerlendiriyoruz. Ayrıca kodlayıcı başka bir tercümana geçmeye karar verirse, komut adı da değişecektir ve kullanıcı ve kodlayıcı aynı kişi olsa bile, çok sinir bozucu olan bu araçları kullanan diğer komut dosyalarını değiştirmek zorunda kalacağım .

Ancak diğer yandan, proje oluşturma dizinlerinde .sh veya .tcl gibi uzantıları kullanıyorum. Bu şekilde , dosyaları hedef dizinlerine dağıtmak için make özelliklerinden faydalanabilirim - ancak bu aşamada dosya sonekini kaldırırım.


6

Açıkçası, bindizinlerdeki yürütülebilir dosyalar ile düzenlenebilir "kaynak" dosyalar arasında bazı farklılıklar var .

  • Kaynak dosyalar için, bir sonekin olması yararlıdır, böylece neyin ne olduğunu görebilir ve #!satırı taramayı başaramayan daha az akıllı araçlara yardımcı olabilirsiniz .
  • Modüllerin için, onlar sadece aynı tercüman (veya hiç tercüman) kullanan tüm bunların programların alakalı bir kümedeki kullandığı ve katılması alışıldık ediyoruz .pm, .shya .sobu gibi durumlarda.
  • Yürütülebilir programlar için, adı, kullanıcıların ve diğer komut dosyalarının çağırdığı "programlama sözleşmesinin" bir parçasıdır. Uygulama yapsa bile adın değişmemesi önemlidir ; yani Açıkçası dosya adı olmalıdır değil bir sonek

Derlenmiş bir program durumunda, "kaynak" ve "çalıştırılabilir" arasındaki fark açıktır: biri kaynak kodu, diğeri makine dili veya yorumlanan bayt kodu. Bir komut dosyası durumunda, bariz bir fark yoktur, ancak makekomut, "komut dosyası için kaynak kod" ile "komut dosyasının çalıştırılabilir sürümü" arasında bir ayrım sağlar: "kabuk komut dosyası" için varsayılan "derleyici" cp.

Ayrı bir $HOME/sourcedizin tutmanızı tavsiye ederim , ya da:

  • tarafından yapılan gibi bir sembolik bağ tutulması ln -s ../source/foo.sh $HOME/bin/foo; veya
  • kullanarak değişiklikleri yaptıktan (ve test ettikten sonra) manuel olarak kopyalayın install -m 755 foo.sh ../bin/foo; veya
  • Bir kullanarak Makefilekural gelen kaynak dosyayı kopyalamadan önce bir sözdizimi denetimi gerçekleştirmek için $HOME/sourceiçine$HOME/bin

Dipnot: Bir kabuk betiği modülü yalnızca başka bir kabuk betiği tarafından kullanılabilir ve bu betiğin iç bağlamını .veya sourceyerleşik komutlarını kullanarak değiştirir . Bu, (herhangi bir program gibi) ayrı bir işlem olarak çalışan ve ana işlemini değiştiremeyen yürütülebilir bir komut dosyasından farklıdır. Zorlu bir kongre olarak, modüller /usr/lib/name_of_program/name_of_module.shgirerken, komutlar /usr/bin/name_of_commandda girer (ekler olmadan).


3

Gereksiz. Çekirdek, kullanılacak doğru tercümandan ( #!satırdan itibaren) zaten haberdar edilir ve tüm popüler metin editörleri de okur, böylece bir uzantı eklemek, hiçbir şey yapmaz, yalnızca yazıyı arttırır. Bir çalıştırılabilir programın bir uzantısına sahip olduğu tek zaman, bir şekilde önemli olduğu zamandır (program veya kullanıcı veya her ikisi için).


Öte yandan, modüller ve kütüphaneler hemen hemen her zaman uzantılara sahiptir ( .rbRuby modülleri .soiçin, ELF paylaşımlı kütüphaneleri vb. İçin).


Buradaki soru çok fazla değil, 'eki sağlamadığımda çekirdeği çalıştırabiliyor mu' ama 'bana yardım ediyor mu' ile ilgili değil. Yazılan karakterlerin artması, tamamlanma ile ilgili değildir.
akira
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.