Bash dosya uzantısı nedir?


84

Bir metin düzenleyicide bir bash betiği yazdım, bash betiği olarak çalışabilmesi için betiğimi hangi uzantı olarak kaydederim? Teorik olarak bir ssh sunucusu başlatması gereken bir komut dosyası oluşturdum. Betiğe tıkladığımda betiğin nasıl çalıştırılacağını merak ediyorum. OS X 10.9.5 çalıştırıyorum.


4
Kabuk betiği belirli bir uzantı gerektirmez. Olarak çalıştırbash myscript
anubhava

7
Genellikle budur .sh, ancak uzantının var olması gerekmez. Linux, Windows değildir. Senaryonuzu yorumlayacak program, olması gereken ilk satırında belirlenir #!/bin/bash. Parametreleri bile içerebilir.
Havenard

1
@anubhava Sadece üzerine çift tıklasam ve aslında "bash myscript" yazmazsam betiğimi nasıl çalıştırırdım
Amedeo

2
@Amedeo, dosyanızı satırla yönlendirir #!/bin/bash.
Havenard

Yanıtlar:


110

Diğer cevaplarla aynı fikirde .sholmamakla birlikte, kabuk komut dosyaları için bir uzantı kullanmak için yaygın bir kural vardır - ancak bu kullanışlı bir kural değildir. Bir uzantı kullanmamak daha iyidir. foo.shİsmi nedeniyle bunun bir kabuk betiği olduğunu söyleyebilmenin avantajı minimumdur ve esneklik kaybı ile bunun için ödeme yaparsınız.

Bir bash betiğini çalıştırılabilir yapmak için , üstte bir shebang satırı olması gerekir :

#!/bin/bash

ve chmod +xkomutu, sistemin onu yürütülebilir bir dosya olarak tanıması için kullanın . Daha sonra, dosyanızda listelenen dizinlerden birine yüklenmesi gerekir $PATH. Komut dosyası çağrılırsa foo, bunu bir kabuk isteminden yazarak çalıştırabilirsiniz foo. Veya geçerli dizindeyse (geçici komut dosyaları için ortaktır), yazabilirsiniz ./foo.

Ne kabuk ne de işletim sistemi dosya adının uzantı kısmına dikkat etmez. Bu sadece ismin bir parçası. Ve tarafından değil buna özel bir uzantısı vererek, bunu yok kullanımları o (sh, bash, csh, ya da herneyse) bir kabuk olsun, o nasıl uygulandığına bakım ki (bir kullanıcı veya başka bir komut dosyası olarak) o kimseyi sağlamak , bir Perl, Python veya Awk betiği veya çalıştırılabilir bir ikili dosya. Sistem, nasıl uygulandığını bilmeden veya umursamadan yorumlanmış bir komut dosyası veya ikili yürütülebilir dosya çağrılabilecek şekilde özel olarak tasarlanmıştır.

UNIX benzeri sistemler, tamamen metinsel bir komut satırı arayüzüyle başladı. KDE ve Gnome gibi GUI'ler daha sonra eklendi. Bir GUI masaüstü sisteminde, tipik olarak bir programı (yine bir komut dosyası veya bir ikili yürütülebilir dosya) çalıştırabilirsiniz, örneğin, ona atıfta bulunan bir simgeye çift tıklayarak. Genellikle bu, programın yazdırabileceği herhangi bir çıktıyı atar ve komut satırı argümanlarını iletmenize izin vermez; bir kabuk isteminden çalıştırmaktan çok daha az esnektir. Ancak bazı programlar için (çoğunlukla GUI istemcileri) daha uygun olabilir.

Kabuk komut dosyası oluşturma en iyi şekilde bir GUI'den değil komut satırından öğrenilir.

(Bazı araçlar yapmak dosya uzantılarına ödeme dikkati Örneğin, derleyiciler genellikle kod yazıldığı dili belirlemek için uzantıyı kullanın:. .cC, .cpp. C ++, vb Bu kongre çalıştırılabilir dosyalar için geçerli değildir)

UNIX'in (ve UNIX benzeri sistemlerin) Windows olmadığını unutmayın. MS Windows, nasıl açılacağını / çalıştırılacağını belirlemek için genellikle bir dosyanın uzantısını kullanır. İkili yürütülebilir dosyaların bir .exeuzantıya sahip olması gerekir . Windows altında kurulu UNIX benzeri bir kabuğunuz varsa, Windows'u bir .shuzantıyı kabuk komut dosyası olarak tanıyacak şekilde yapılandırabilir ve kabuğu açmak için kullanabilirsiniz; Windows #!kuralı yok.


2
Dördüncü paragrafta bahsettiğiniz şey amacım. Komut dosyamı ona başvuran bir simgeye tıklandığında çalıştırıyorum.
Amedeo

2
@Amedeo: O zaman masaüstü ortamınıza bağlı. Kullandığım dosyada (Ubuntu altında Cinnamon), yürütülebilir bir komut dosyasının simgesine çift tıklamak, onu bir terminalde çalıştırmamı, bir düzenleyicide görüntülememi veya terminal olmadan çalıştırmamı istiyor. Dosya uzantısından bağımsız olarak bunu yapar.
Keith Thompson

4
(Necro) Uzantıyı atlarsanız, aynı isimli bir klasöre sahip olamazsınız. Yani, örneğin, ek dağıtım mantığına sahip bir klasörünüz deploy.sh(veya deploy.bash) ve bir klasörünüz var deploy. Komut dosyasını basitçe yeniden adlandırırsanız, deploybir ad çakışmasına neden olur. Dosyayı veya klasörü farklı şekilde adlandırmak, yönetilebilirliği ve muhtemelen dosya sıralamayı ( lsdüzenleyicilerde vb.) Olumsuz etkiler. Elbette, mesele - sonunda - belirleyicidir. Ancak dosya uzantılarının doğru yeri vardır.
Kafoso

2
@Kafoso: Aynı isimli bir senaryoya ve dizine ihtiyacım olduğunu hiç düşünmüyorum. Yapsaydım, dizini arayabilirdim Deploy, ancak bu durum büyük / küçük harfe duyarlı olmayan bir dosya sistemine kopyalarken sorunlara neden olabilir.
Keith Thompson

2
Mac'te dosyalara çift tıklamak her zaman onları varsayılan uygulamada açar. Bu nedenle .sh, komut dosyasının istediğiniz düzenleyicide açılması için bir uzantıya sahip olmak yararlıdır . Çift tıklandığında bir komut dosyası çalıştırmak istiyorsanız, ona .commanduzantıyı verin ve çift tıklandığında Terminal'de çalışacaktır.
BallpointBen

18

Herhangi bir uzantıya ihtiyacınız yoktur (veya isteğe bağlı bir uzantı seçebilirsiniz, ancak .shyararlı bir kuraldır).

Betiğinize #!/bin/bash(ilk satır execve (2) sistem çağrısı tarafından anlaşılır ) ile başlamalı ve dosyanızı çalıştırılabilir hale getirmelisiniz chmod u+x. yani komut dosyanız bir $HOME/somedir/somescriptname.shdosyadaysa bir kez yazmanız gerekir

 chmod u+x  $HOME/somedir/somescriptname.sh

bir terminalde. Bkz chmod (1) komut ve için chmod (2) sistem çağrısı için.

Eğer bütün dosya yolunu yazdığınız sürece, belirtilen bazı dizinde bu dosyayı koymalıyız senin PATH(bkz envirom (7) ve execvp (3) ) Eğer kalıcı ayarlayabilirsiniz, ~/.bashrcgiriş kabuğu ise bash)

BTW, betiğinizi başka bir dilde, örneğin Python'da ile başlayarak #!/usr/bin/pythonveya Ocaml'da #!/usr/bin/ocaml... ile başlayarak yazabilirsiniz .

Komut dosyanızı çift tıklayarak yürütmek (neye? Söylemediniz!) Bir masaüstü ortamı sorunudur ve masaüstüne özel olabilir (Kde, Mate, Gnome, .... veya IceWM veya RatPoison ile farklı olabilir). Belki EWMH özelliklerini okumak daha iyi bir resim elde etmenize yardımcı olabilir.

Belki komut dosyanızı çalıştırılabilir chmodyapmak, masaüstünüzde tıklanabilir hale getirebilir (görünüşe göre, MacOSX'te Quartz ). Ama sonra muhtemelen görsel geribildirim vermesini sağlamalısın.

Ve ssh ile uzaktan eriştiğinizde kendinizinki de dahil olmak üzere birçok bilgisayarda herhangi bir masaüstü bulunmaz .

Kabuk betiğinizi tıklayarak çalıştırmanın iyi bir fikir olduğuna inanmıyorum. Muhtemelen kabuk betiğinize argümanlar verebilmek istiyorsunuz (ve bunu tıklayarak nasıl yapardınız?) Ve çıktısını önemsemelisiniz. Bir kabuk betiği yazabiliyorsanız, bir terminalde etkileşimli bir kabuk kullanabilirsiniz. Bir senaryoyu kullanmanın en iyi ve en doğal yolu olduğunu. İyi etkileşimli mermiler (örn. Zsh veya balık veya belki yeni bash), lezzetli ve yapılandırılabilir otomatik tamamlama olanaklarına sahiptir ve çok fazla yazmak zorunda kalmazsınız ( tabklavyenizin tuşunu kullanmayı öğrenin ). Ayrıca, komut dosyaları ve programlar genellikle bileşik komutların (ardışık düzenler, vb.) Parçalarıdır.

PS. 1986'dan beri Unix ve 1993'ten beri Linux kullanıyorum. Kendi programlarımı veya komut dosyalarımı asla tıklayarak başlatmadım. Neden yapayım?


3
Tamam, betiğimi bir metin düzenleyicide oluşturdum. Dosyayı masaüstüme kaydediyorum. Masaüstüme kaydedilen komut dosyama tıkladığımda, aslında üzerine tıkladığımda çalıştırılmasını istiyorum.
Amedeo

6
Masaüstünüzün ne olduğunu bilmiyorum (KDE, Gnome, MATE, ...). Sizi, özellikle komut dosyalarınızı çalıştırmak için bir terminalde komut satırını kullanmaya şiddetle davet ediyorum (muhtemelen onlara bazı argümanlar vermek istersiniz; bunu masaüstünde nasıl yapardınız?). Bir kabuk betiğini kodlayabiliyorsanız, kabuğu bir terminalde etkileşimli olarak kullanabilmelisiniz
Basile Starynkevitch

2
Demek istediğim, eğer bir kabuk betiği kodluyorsanız, bir terminalde bir komut satırı kullanma alışkanlığını edinmelisiniz.
Basile Starynkevitch

2
Bunu anlıyorum, çalıştığım bir proje için. Komut dosyasının tıklandığında çalışmasını istiyorum. Komut dosyasını çalıştırmak için terminal kullanmaktan kaçınmaya çalışıyorum.
Amedeo

3
Çalıştırılabilirliği sahibine kısıtlamak için belirli bir neden olmadıkça, chmod +xyerine kullanırdım chmod u+x.
Keith Thompson

2

sadece .sh.

Komut dosyasını şu şekilde çalıştırın:

./script.sh

DÜZENLEME: Anubhava'nın dediği gibi, uzantı gerçekten önemli değil. Ancak organizasyonel nedenlerden ötürü, yine de uzantıların kullanılması önerilir.


6
Bir komut dosyası çalıştırıyorsanız, genellikle ne yazdığını umursamak için hiçbir nedeniniz olmaz. Bir bash betiği ve bir ikili yürütülebilir dosya aynı şekilde çalıştırılır. .shYürütülebilir bir betiğe bir sonek eklemek genellikle gereksiz bir dağınıklıktır.
Keith Thompson

1
evet, ama benim düzenlememde söylediğim gibi - bu komut dosyalarını organize etmek için bir kuraldır - daha fazlası değil mi ?!
Marc Anton Dahmen

5
Bir .shuzantıya sahip (ve daha az uzantıya sahip) çok sayıda komut dosyası görüyorum .bash, ancak bunun yararlı olduğuna ikna olmadım. Bir komut dosyasını adlandırırsam foo.shve daha sonra onu Perl'de yeniden uygulamaya karar verirsem, adı değiştirebilir (ve onu kullanan her şeyi düzenleyebilir) veya yanıltıcı bir uzantıyla bırakabilirim. Adını koyarsam foo, o sorunum yok.
Keith Thompson

Bir kullanım kendimi düşünebiliriz @KeithThompson, ben do ben Perl için konuşamıyor. Komut dosyası içinde ne olduğu önemli ama bir komut dosyası Python veya Bash yazılmışsa ben çok umurumda olacaktır. Genelde bir Bash betiğinin ne olursa olsun çalışacağını varsayabilirim, ancak Python betiklerinin bağımlılıkları vardır ve Python 2 ve Python 3 birbirleriyle uyumlu değildir. Ayrıca, farklı bağımlılık ihtiyaçları olduğu için (örneğin, bir ikili dosyanın kütüphanelere ihtiyacı olabilir ve AMD64 için derlenebilir ve sadece bunun üzerinde çalışır) derlenmiş ikili dosyalar ve komut dosyaları (her ikisinin de uzantısı yoktur) arasında ayrım yapmanın önemli olduğunu düşünüyorum.
JRH

@jrh Elbette, bazen önemlidir (ve koşarak head -1 script.fooveya kullanarak anlayabilirsiniz file script.foo). Ancak her şey doğru bir şekilde kurulur ve yapılandırılırsa, zamanın% 99'unda komutun yapması gerekeni yapmasını istiyorum. Benim için bu, her çalıştırdığımda bir .pyveya .bashson ekin farkında olmak zorunda olmayı haklı çıkarmaz .
Keith Thompson

2

Bunun artık oldukça eski olduğunu biliyorum ama bunun sorunun ne istediğine katkıda bulunduğunu düşünüyorum.

Mac kullanıyorsanız ve bir komut dosyasını çift tıklayarak çalıştırabilmek istiyorsanız, .commanduzantıyı kullanmanız gerekir . Dosyayı çalıştırılabilir hale getirmeden öncekiyle aynı chmod -x.

Daha önce de belirtildiği gibi, bu gerçekten o kadar kullanışlı değil.


1

TL; DR - Komut dosyasının kullanıcısı (geliştirici olması gerekmez) bir GUI arayüzü kullanıyorsa, hangi dosya tarayıcısını kullandıklarına bağlıdır. MacOS'un Bulucusu .sh, komut dosyasını yürütmek için uzantıya ihtiyaç duyacaktır . Bununla birlikte, Gnome Nautilus, .shuzantı olsun veya olmasın düzgün şekilde değiştirilmiş komut dosyalarını tanır .

Bash komut dosyalarında bir uzantı kullanmanın ve kullanmama nedenlerinin birçok kez söylendiğini biliyorum, ancak uzantıların neden veya neden kullanılmaması gerektiği kadar değil, ancak iyi bir pratik kural olarak düşündüğüm bir şeye sahibim.

Bash'e girip çıkan ve genel olarak terminali kullanan bir tipseniz veya terminali kullanmayan biri için bir araç geliştiriyorsanız .sh, bash betiklerinize bir uzantı koyun . Bu şekilde, bu komut dosyasının kullanıcıları, komut dosyasını çalıştırmak için bir GUI dosya tarayıcısında o dosyaya çift tıklama seçeneğine sahip olur.

İşinizin tamamını veya çoğunu terminalde yapan bir tipseniz, bash betiklerinize herhangi bir uzantı koymaya zahmet etmeyin. ~/.bashrcKomut dosyalarını dizinlerden görsel olarak ayırt etmek için dosyanızı zaten ayarladığınızı varsayarsak, terminalde hiçbir amaca hizmet etmezler .

Düzenle:

Gnome Nautilus dosya tarayıcısında, bir terminal penceresi açmak için aptalca basit bash komutuyla (her biri yürütülecek dosya için verilen izinlere sahip) 4 test dosyası ile gnome-terminal:

  1. #!/bin/bashİlk satırında NO uzantılı bir dosya .

    Dosyaya çift tıklayarak çalıştı.

  2. İlk satırda .shuzantılı bir dosya #!/bin/bash.

    Dosyaya çift tıklayarak çalıştı.

  3. #!/bin/bashİlk satırında NO olan NO uzantılı bir dosya .

    Dosyaya çift tıklayarak çalıştı ... teknik olarak, ancak GUI bunun bir kabuk betiği olduğuna dair hiçbir gösterge vermedi. Sadece düz bir metin dosyası olduğunu söyledi.

  4. İlk satırında .shNO olan bir uzantıya sahip bir dosya #!/bin/bash.

    Dosyaya çift tıklayarak çalıştı.

Ancak, Keith Thompson'ın bu cevabın yorumlarında akıllıca işaret .shettiği gibi, dosyanın ilk satırında ( #!/bin/bash) bash shebang yerine uzantının kullanılması sorunlara neden olabilir.

Ancak bir diğeri, daha önce MacOS kullanırken, düzgün bir şekilde değiştirilmiş (bu bir kelime mi?) Bash betikleri bile bir .shuzantı olmadan MacOS'taki GUI'den çalıştırılamadığını hatırlıyorum . Yine de birisinin yorumlarda beni düzeltmesini isterim. Bu doğruysa, .shuzantının önemli olduğu yerde en az bir dosya tarayıcısı olduğunu kanıtlayacaktır .


Hangi GUI dosya tarayıcısını kullanıyorsunuz (veya daha uygun olarak, kullanıcılarınız ne kullanıyor)? Bir komut dosyasının nasıl çalıştırılacağına karar vermek için uzantıyı kullanıyor mu?
Keith Thompson

En çok deneyime sahip olduğum platform MacOS. Finder'da kullanıcı, hangi uygulamaların hangi uzantı ile ilişkilendirileceğine karar verir. Şimdi, Gnome kullanıyorum Linux'tayım, ancak Gnome'un Nautilus dosya tarayıcısının henüz uzantısı olmayan dosyalarla nasıl etkileşime girdiğini deneyemedim.
Ryan Hart

Son .sheki olan ve #!/bin/bashilk satırda çalıştırılabilir bir komut dosyanız varsa , shonu çağırmak için bir GUI dosya tarayıcısı mı kullanacak (shebang'ı yok sayarak)? Eğer öyleyse, bu bazı sorunlara neden olabilir. (Cevap, farklı tarayıcılar için farklı olabilir.)
Keith Thompson

Orada iyi noktalar. Yukarıdaki cevabımı, şimdi yaptığım bazı gerçek testlerle güncelledim.
Ryan Hart

İlginç, ama ... "İşe yaradı" dedin. 4 test durumunun her biri için, onu /bin/bashveya ile mi çağırdığını bilmek iyi olacaktır /bin/sh(ikincisi, shebang içermeyen bir komut dosyası için varsayılandır). Eğer /bin/shsembolik köprü ise /bin/bash(oldukça yaygındır) o zaman değerine bakarak anlayabilirsiniz $0. (Ayrıca, bash shayarlandığında çağrılırsa POSIXLY_CORRECT=y.)
Keith Thompson
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.