Unix shell scriptleri için dosya uzantıları [kapalı]


45

Wikipedia'da, .sh makalesinde şöyle yazıyor:

.Sh dosya uzantısı türü için Bourne kabuğuna bakın .

Diğer unix kabukları nasıl?

Shebang'ın dosyada bir tercüman belirtmek için kullanıldığını biliyorum , ama merak ediyorum:

  • Dosya uzantıları vs dosya uzantıları vs lehte ve aleyhte olanlar nelerdir?

4
Bazen, shebang (veya çalıştırma izinleri olmadan) olmadan kabuk komut dosyaları bulunabilir. Bu durumda, .sh ile biten bir isim, kullanıcının bunları bash script.sh(veya shelbette) çalıştırması için bir ipucu olabilir .
Ansgar Esztermann,

3
Bir kabuk betiğinin bir uzantısı varsa, genellikle .sh'dir. Hiçbir zaman bir .ksh veya .bash senaryosu görmedim. Çoğu kabuk betiğinin bir uzantısı yoktur, örneğin /etc/init.d/* içindeki tüm betikler gibi.
Richard Holloway

Basit bir sonuç (evet veya hayır) görüş olsa da, dikkate alınması gereken şeyler değildir.
ctrl-alt-delor

Yanıtlar:


35

Ben sadece çağırır .shbir şeyi demekti taşınabilir olması (ve umarım bir taşınabilir).

Aksi halde, dili gizlemenin daha iyi olacağını düşünüyorum. Dikkatli okuyucu zaten onu shebang hattında bulacak. (Uygulamada, .bashveya .zsh, vb… ekler nadiren kullanılır.)


1
Sadece bu sayfadan, onu kullanan, oldukça önemsiz miktarda insan görebiliyoruz. Neden nadiren kullanıldıklarını söylüyorsunuz? Alıntı var mı? Yoksa bu sadece deneyimine mi dayanıyor?
Pacerier

23

Teknik olarak kesinlikle dosya uzantıları için "iyi uygulamaların" bulunmadığını söyleyebilirim: Unix / Linux / * BSD dosya sistemleri uzantıları kendi başlarına desteklemiyor. Bir uzantı olarak adlandırdığınız şey yalnızca tek bir dosya adının sonekidir. Bu, inode-moral eşdeğerinde özel bir noktanın bir uzantı için ayrıldığı VM / CMS, VMS, MS-DOS ve Windows dosya sistemlerinden ve işletim sistemlerinden farklıdır.

Şimdi o küçük rant bitti, sanırım bir kabuk betiği dosya adına ".sh" veya ".ksh" veya ".bash" sonekini koymak biraz saçma. Bir program bir programdır: Neyin gerçekleştirileceğini ayırt etmenin faydası yoktur. Unix, linux veya çekirdeğin bir dosya teriminden dolayı bazı dosyalarda tercüman çağırmaya karar vermesine neden olan bir şey yoktur. Bunların tümü, #!satırın başında ya da dosyanın başında bulunan "sihirli sayı" bayt dizisi tarafından yapılır . Aslında, "uzantı" adlı bir dosya adına göre neyin yürütüleceğine karar vermek, Windows'u bir malware mıknatısı yapan faktörlerden biridir. Kaç tane Windows kötü amaçlı yazılım dolandırıcılığının "something.jpg.exe" adlı bir dosya içerdiğine bakın - varsayılan olarak daha yeni Windows ".exe" uzantısını göstermez ve bir kullanıcıyı sadece "çift tıklamaya teşvik eder"

İleriye dönük bir komut olarak düşünebileceğiniz şey, yine de genellikle bir kabuk betiğidir. Bazen ccbir sh betiği olmuştur, firefoxbir sh betiği, startxbir sh betiğidir. Bir betiği ".sh" ekiyle işaretlemenin bilişsel veya örgütsel bir yararı olduğuna inanmıyorum.


24
Katılmıyorum! İşim, ikili çalıştırılabilir dosyalardan kabuk komut dosyalarına (ksh, bash ve bazı eski csh) kadar uzanan binlerce dosyayı içeren bir uygulamayı paketlemekten ibarettir. Bana göre, inan bana o yapar biz tartıştığımız ve biz arıyoruz tür dosyanın bir bakışta ne (veya regex) 'de bilmek muktedir bir fark yaratır. Benim nokta olmasıdır olabilir excuted alır ve bir şey ayırt bir yararı en iyi uygulama açıkça dosya türünü belirten teşvik etmelidir.
rahmu

4
@rahmu: Bunu bir cevap olarak yazın. Düzenli ayırt edici adların bu uygulamayı paketlemenize (ve belki de korumasına) nasıl yardımcı olduğu hakkında bazı bilgiler verin. Özellikle dosyayı neyin yorumladığını ve dosya adının sonekini ve bunun size işlerde size nasıl yardımcı olduğunu arasındaki etkileşime dikkat edin. Bakış açımla ilgili ciddi tartışmalara ilgi duyuyorum ve ikna olursam değişmeye hazırım. Bunu kanıtlamak için yorumunuzu değiştirdim.
Bruce Ediger,

3
Çok isterim, maalesef şu anki işimdeki mevcut tecrübemden sadece bahsedebilirim. Genel olarak iyi uygulama ve standartlar hakkında pek bir şey bilmiyorum ; Buraya bir cevap yazmadan önce biraz araştırma yapmam gerektiğini düşünüyorum. Bu gece işten sonra bakacağım :)
rahmu

2
@rahmu "Dosya" komutu, dosya tipini belirlemek için mevcuttur. Farklı mermiler için yazılmış senaryoları ayırt edebilir.
Matt

3
Bir kabuk betiğine bir .shuzantı verirseniz, .shonu başlatırken komut adının bir parçası olarak yazmanız gerekir. Bu uzantıyı koymaktan hoşlanmamamın ana nedeni (shebang çizgisine sahip herhangi bir şeyle aynı). BTW, Windows'taki sorun .exekendi başına bir önek değil (sonuçta image.jpgLinux'ta bir çalıştırılabilir yapmak önemsizdir ), ancak Windows'un genellikle bu uzantıyı gizlemesi, bir çalıştırılabilir dosyayı başlatmak için gereken eylemle birlikte olması Bir belgeyi açmak için tamamen aynıdır.
celtschk

12

Çok sayıda? Nix ortamında çalışan biri olarak, çok çeşitli mermilerde yazmak zorunda kaldım. İster inanın ister inanmayın, platformlar boyunca, kabuklar aynı değildir. Eğer kişisel kütüphanenizi çoklu mermilerde tutarsanız (gerektiğinde) mermileri tanımlamak için uzantılar kullanmak çok yararlı olacaktır. Bu şekilde başka bir platforma geçtiğinizde ve kabuk biraz farklı olduğunda, modifikasyonlar için hangi komut dosyalarını hedefleyeceğinizi bilirsiniz. .sh .ksh .bsh .csh ...



Eğer bir yok mu #!komut (örneğin başlangıcında #!/bin/bash)?
ctrl-alt-delor

Gnu / Linux, BSD ve UNIX'lerin hepsi Unix'tir. Gerek yok mu? Linux bir çekirdek, android Linux kullanıyor ancak bir Unix değil (eğer ekstra bir yazılım eklemiyorsanız, bu durumda bir Unix uygulamanız var).
ctrl-alt-delor

@ ctrl-alt-delor: "Unix" bir ticari markadır . İnsanlar genellikle ticari marka sorununu (ve markaları) önlemek için "? Nix" kullanırlar.
JS.

@JS `UNIX ', Open Group'un ticari markasıdır. Unix ve unix greens.org
ctrl-alt-delor

5

Dediğiniz gibi, Unix dosya uzantıları tamamen bilgidir. Sen sadece doğru bir shebang ve çalıştırılabilir olması için betiğine ihtiyacın var.

Herhangi bir uzantıya sahip olamazsınız ya da kullanabilirsiniz .sh.

Şahsen, kullanılan kabuğu ne olursa olsun (csh, tcsh, bash, sh, ...) aşağıdaki kuralları kullanırım:

  • sistem veya yüksek dereceli komut dosyaları için uzatma yok (son derece nadir).
  • .shyüksek dereceye klasik komut dosyaları için, düşük.

"Klasik senaryolar, alçaktan yükseğe" ile ne demek istiyorsun?
Pacerier

Sanırım bununla soyutlama ya da organizasyon seviyesi demek istedim. Bu, bazı komutların arkasında hangi dil / komut dosyası aracının kullanıldığı umrunda değil: bu nedenle herhangi bir uzantı kullanmıyorsunuz. Diğerleri için, bir bash veya bazı egzotik ksh kabuk betiği (uygun uzantıyla) olduğunu bilmek iyidir. ... ama bu 2 yıl önceydi;)
Ouki

5

Değiştirilebilir olmadıkları için çalıştırılabilir dosyalar için bir uzantı kullanmamalısınız. Bir kabuk betiğiniz olduğunu düşünün a.sh, sonra python'a tekrar yazın a.py, artık betiği çağıran her programı değiştirmek zorundasınız, uygulama detaylarını sızdırmışsınız.

Mircosoft en Windows'da bütün dosya adı uzantısı şey bir karmaşa: ne olabilirdi örneğin a.audio, b.audio, c.audio, bir a.mp3, b.wav, c.oggve d.picture, e.picture, f.picturebir d.jpeg, e.png, f.gif. Çoğu zaman sesin veya resmin hangi formatta olduğunu umursamıyoruz. Ayrıca, yeni kullanıcılara tüm dosya uzantılarını öğretmek için uzun zaman harcamak zorundayız.


Diğer nedeni kullanmamaya *.shDebian en olmasıdır içine sadece koştum run-partsböyle olduğu gibi, uzantıları ile komut çalışmaz /etc/cron.*/: archive.oreilly.com/pub/post/runparts_scripts_a_note_about.html
Ross Patterson

3

Kabuk betiği uzantıları oldukça kullanışlıdır. Örneğin, genellikle aynı dizinde birden fazla dilde (örneğin bash, awk ve lua) birden fazla dosya içeren komut dosyaları yazarım. Yalnızca bash dosyalarında bir dize aramam gerekirse, yanlış pozitifleri azaltmak için uzantı bunu çok kullanışlı kılar. Ya da o proje için tüm bash kodumun satır sayısını yapmak istersem.

Programı çalıştırırken uzantıyı yazmak zorunda kalmak çok acı verici bir durum; bu nedenle, her seferinde uzantıyı yazmaya gerek kalmadan düzenlemek / çalıştırmak için ana çalıştırılabilir dosyaya uzantı olmadan bir bağlantı yapıyorum. Symlinks ucuz ve kolaydır.



2

Diğerlerinin dediği gibi, kabuk uzantıları umursamıyor. Ancak, dosyaların hızlı bir şekilde insan tarafından tanımlanmasını sağlar. Dosyaları biten .pyya da görüyorum .shve ve en azından ne olması gerektiğini hemen biliyorum. Steve'in dediği gibi, dosya uzantısına göre arama yapmak veya satır sayımı yapmak da pratik hususlardır.

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.