Aynı soru, sadece bash olanları değil, herhangi bir komut dosyası türünü kullanırken de ortaya çıkabilir. Yorumlayıcı aracılığıyla bir komut dosyası çalıştırmakla doğrudan çalıştırmak arasında büyük bir fark var mı?
Let's Use Linux (uL) 'dan bu ilginç gönderide ortaya çıkaracağımız bir gizem daha. |
Betiğin dosya adını bir yorumlayıcıya (sh, python, perl, vb.) İleterek bir komut dosyası çalıştırdığınızda, aslında yorumlayıcıyı çalıştırırsınız, yürütmek istediğiniz programı bir argüman olarak iletirsiniz. Örneğin, sh yorumlayıcısını ona miscript.sh argümanını ileterek çalıştırıyoruz.
sh myscript.sh
Betiği kendi başına çalıştırırsanız, sistem ihtiyaç duyduğu yorumlayıcıyı çağırır ve ardından evet, komut dosyasını çalıştırır, yorumlayıcıya bir argüman olarak iletir, ancak hepsi otomatik olarak ve betiği çalıştıran kullanıcı bilmeden.
./myscript.sh
Bir komut dosyasını kendi başına çalıştırmak için 2 koşulun karşılanması gerekir:
1) komut dosyası bir "işaret satırı" içermelidir. Bu, bir komut dosyasının ilk satırıdır ve # karakterleriyle başlamalıdır! ve yorumlayıcının bulunduğu yeri belirtmeniz gerekir. Bu koşulun sadece bash ile ilgili olanlar için değil, herhangi bir komut dosyası türü (python, perl, vb.) İçin geçerli olduğuna dikkat etmek önemlidir.
Bu nedenle, örneğin, komut dosyamız ilk satır olarak aşağıdakileri içermelidir:
#! / Bin / bash
2) dosyanın yürütme izinlerine sahip olması gerekir:
Komut dosyamıza yürütme izinleri vermek için şunu yazmalıyız:
chmod a + x miscript.sh
Hazır, şimdi şu şekilde çalıştır:
./myscript.sh
Veya betiği, kolayca çalıştırılmasına izin veren "özel" bir yola kopyalayarak. Örneğin, / usr / sbin dizinine kopyalayabilir ve bulunduğu yerin tam yolunu eklemeden herhangi bir yerden çalıştırabiliriz:
Kopyalıyoruz:
sudo cp miscript.sh / usr / sbin / miscript
Yapıyoruz:
yanlış yazı
Gördüğünüz gibi, gerçekte perde arkasında olanlar her iki durumda da çok benzer. Bununla birlikte, bir "satır" ekleyerek, komut dosyalarınızı dağıtmak çok daha kolay olacaktır, çünkü kullanıcıların bunları yürütebilmek için gerekli yorumlayıcıların bulunduğu yolu hatırlamaları gerekmeyecektir. Sonuç: Bu temelde bir rahatlık meselesidir.
Size katılıyorum Erpower, hem yorumlayıcının sürümü hem de yolu değişken ve sabit değil, dahası GNU / Linux dağıtımlarının Bash'i kullanan tek dağıtım olmadığı düşünülürse (ayrıca: freeBSD, OpenSolaris, Mac) ve birçok bunların farklı konfigürasyonları veya yolları var.
Önemli olan şey, betiğe çağrı ile oynamak için esnekliğe sahip olduğunuzu bilmektir (iyi bahsettiğiniz gibi) ./ veya sh ile (veya python ... vb.)
Bash, işlevi emirleri yorumlamak olan bir bilgisayar programıdır.
Unix kabuğuna dayanır ve POSIX uyumludur.
bunun yerine sh, işlevi emirleri yorumlamak olan bir bilgisayar programıdır.
Süreç kontrolü, yeniden yönlendirme gibi özellikleri içerir
girdi / çıktı, dosya listeleme ve okuma, koruma,
iletişim ve program yazmak için komut dili
gruplar veya komut dosyaları. Unix'in ilk sürümlerinde kullanılan tercümandı ve fiili bir standart haline geldi.
Merhaba, senaryoların kullanımında yeni başlayan biriyim ve sahip olduğum bir problemde birinin bana yardım edip edemeyeceğini bilmek istiyorum:
Konsol aracılığıyla birkaç başlangıç verisinin dahil edilmesini gerektiren bir programı yönetiyorum ve bir komut dosyası aracılığıyla programı çalıştırmam gerektiğinde tekrar tekrar yazmak zorunda kalmamak için programı ilk verilerle çalıştırmanın mümkün olduğunu öğrendim.
Nasıl yapacağımı bilmiyorum, bu yüzden birisi bana bu konuda yardım edebilirse çok minnettar olacağım.
Bak, bu senaryoyu hangi programlama dilinde yazdığına bağlı. Ancak, her durumda ihtiyacınız olan şey:
1) Kullanıcının kod çalıştırıldığında bu verileri girmesini istiyorsanız, en yaygın prosedür bir değişkenin girdiye girilen değerleri almasıdır.
2) Değerlerin her zaman aynı olması durumunda, sabitleri kullanabilirsiniz.
3) Diğer bir seçenek, betiğinizin parametre alabilmesidir.
Şerefe! Paul.
Bahsettiğiniz şey ilginç. 2 formdan oluşur: shebang çizgisi veya doğrudan çarpma çizgisi. Size şu bilgileri veriyorum: http://python.about.com/od/programmingglossary/g/defbangline.htm
Şerefe! Paul.
İlginç, bu ayrıntı hakkında düşünmeyi hiç bırakmamıştım. Aralarında sadece uyumluluk ve sistem hızını artırmak için var olan gereksiz kodların kilolarını kaldırmak için ünlü çekirdek yeniden derlemesi de dahil olmak üzere, daha fazla iyileştirici makale görmek ilginç olurdu.
TAMAM. Aklımda tutarım.
Şerefe! Paul.
Çalıştığına sevindim. Her zaman ilginç ve pratik olabileceğini düşündüğüm şeyler göndermeye çalışırım.
Sarılmak! Paul.
İyi alışkanlıklara sahip her programcı, kodun ilk satırına bir "patlama satırı" ekler. Python'da kodlamayı ve patlama çizgisini asla unutmam.
#! / usr / bin / python2.7
# *. * kodlama = utf-8 *. *
Mükemmel, umarım komut satırı hakkında daha fazla bilgi yayınlıyor olabilirsiniz, özellikle kaynak dosyalardan (tar.gz, vb.) Derleme veya yükleme söz konusu olduğunda.
"Bang line" ı hiç duymamıştım, onu her zaman Shebang olarak biliyordum
http://en.wikipedia.org/wiki/Shebang_%28Unix%29
selamlar
ilginç not… teşekkür ederim!
Ne kadar ilginç, programlamada ve senaryoyla ilgili her şeyde kendimi tamamen cahil ilan ediyorum, nasıl çalıştığı hakkında hiçbir fikrim yoktu, ancak bazılarının bu başlığa sahip olduğunu fark ettim.
Bu gönderiyle ilgili olan başıma gelen bir açıklama: Bir adobe air gadget'ı (bir poker oran hesaplayıcısı) yüklemek istedim. Adobe air yükleyicinin yaptığı şey, karşılık gelen komut dosyasını "su" ile ancak ./ biçiminde çalıştırarak sizden kök parolasını sormaktır. Komut dosyası yürütme izinlerine sahip olmadığından, izin reddedildi, çözüm: izinleri değiştirmek istemiyorsanız betiği sh ile çalıştırın (tmp chmod klasörüne gitmekten daha hızlı ve hepsi). Orada komut dosyası yürütülür, adobe yükleyicisini ve başka bir şeyi kelebek olarak çağırır.
Çok ilginç makale! Konsol hakkında biraz daha bilgi edinmeme yardım ettiğiniz için teşekkürler. Bakalım böyle makaleler yayınlamaya devam edecek misin ^^.
Devam edin, bu hiç şüphesiz en sevdiğim blog!
Kullanılan yorumlayıcı sürümleri arasında farklılıklar olabileceğini unutmayın. Komut dosyasını doğrudan shebang'a göre çalıştırmak, gerekli olabilecek yorumlayıcının hangi sürümünün kullanılacağını belirtmenin bir yolu yoktur. Bunun yerine yorumlayıcıyı çalıştırır ve komut dosyasını parametre olarak iletirseniz, hangi sürümünün çalıştığını bilirsiniz.
Örneğin Python'da, eğer shebang #! / Usr / bin / python2.4 ise, program #! / Usr / bin / python2.6 veya #! / Usr / bin / python olduğundan farklı çalışacaktır. (genellikle varsayılan olarak yüklenen ve yapılandırılan Python sürümüne sembolik bir bağlantıdır). Bunun nedeni, Python 2.6'nın Python 2.4'te bulunmayan yeni bir işlevselliğe sahip olmasıdır, bu nedenle, sistemde yalnızca python 2.4 kurulu ise, #! / Usr / bin / python shebang'ı belirten bu işlevi kullanan bir komut dosyası yazmak başarısız olacaktır. Bunun yerine, "python2.4 /path/al/script.py" veya "python2.6 /path/al/script.py / ile başlatarak komut dosyasını istediğiniz python sürümüyle çalışmaya her zaman zorlayabilirsiniz.
Kabuk betikleri için, kullandığınız kabuklar arasında da farklılıklar vardır, bu nedenle #! / Bin / sh ve #! / Bin / bash kullanımlarının betiğe bağlı olarak farklı sonuçları olabilir. Yalnızca bash'de var olan ancak bir shebang #! / Bin / sh belirten özellikleri kullanarak bir komut dosyası yazarsanız, komut dosyanız muhtemelen Linux üzerinde çalışacaktır (çoğu dağıtımda / bin / sh, bash'a sembolik bir bağlantıdır), ancak muhtemelen başarısız olacaktır. bash'nin kurulu olmadığı veya / bin / sh'nin / bin / bash'a sembolik bir bağlantı olmadığı diğer UNIX'ler.
Ayrıca taşınabilirlikle ilgili olarak, bölümde belirtilen yolun mutlak olduğu ve tercümanların başka yerlerde kurulduğu zamanlar olduğu dikkate alınmalıdır. Örneğin, dağıtımınızdan bir paket kullanmak yerine Python'u indirip derlediyseniz, python yorumlayıcısının / usr / local / bin / python içine kurulu olması yaygındır. Shebang'iniz #! / Usr / bin / python ise, betik bu sistemlerde çalışmayacaktır. Bu sorunlardan kaçınmak için, "#! / Usr / bin / env python" (veya "#! / Usr / bin / env sh") olarak şu şekilde açıklandığı gibi kullanabilirsiniz: http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability
Teşekkürler Jonathan! Yorum yaptığınızı görmek güzel!
Şerefe! Paul.
Bilmek istediğim hiçbir yerde yok veya en azından onu arama motoruna nasıl koyacağımı bilmiyorum, xX'in yetenek veya «su» komutunu çalıştırmasının bir nedeni olan bir komut dosyası oluşturmak istiyorum (bu sadece bir örnektir, ancak 2 durum vardır. Düşünebiliyorum) ve yetenek durumunda bazen benden "yon" yazmamı istiyor veya "su" kelimesine şifreyi soruyor ... Betiğin bu seçenekleri otomatik olarak ya bir parametre göndererek ya da bilmediği bir yöntemi kullanarak seçmesini istiyorum ... . İlginiz için teşekkürler
Merhaba Antonio! Eğer sorununuz şifreyi girmek zorunda kalıyorsa, bir çözüm olduğunu sanmıyorum. Kesinlikle bir güvenlik önlemi olduğu için, herkes bir program yükleyemez.
Yetenek ve evet koymak zorunda olmakla ilgili olarak çözülebileceğini düşünüyorum. Bu noktada kullanılacak tam parametreyi hatırlamıyorum, ancak sadece man sayfalarında bulun. Bir terminal açın ve şu komutu girin: man aptitude.
Sarıl! Paul.
Çok güzel gönderi.
Özellikle bu yazıda ortaya çıkan soru / şüphenin çok net ve kısaca yanıtlanmasını çok beğendim.