Sh ve ./ kullanarak bir bash betiği çalıştırmak arasındaki fark nedir

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.


20 yorum, sizinkini bırakın

Yorumunuzu bırakın

E-posta hesabınız yayınlanmayacak. Gerekli alanlar ile işaretlenmiştir *

*

*

  1. Verilerden sorumlu: Miguel Ángel Gatón
  2. Verilerin amacı: Kontrol SPAM, yorum yönetimi.
  3. Meşruiyet: Onayınız
  4. Verilerin iletilmesi: Veriler, yasal zorunluluk dışında üçüncü kişilere iletilmeyecektir.
  5. Veri depolama: Occentus Networks (AB) tarafından barındırılan veritabanı
  6. Haklar: Bilgilerinizi istediğiniz zaman sınırlayabilir, kurtarabilir ve silebilirsiniz.

  1.   Oswaldo Villarroel dijo

    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.)

  2.   he_who_knows@gmail.com dijo

    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.

  3.   Diana C. dijo

    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.

  4.   Hadi Linux kullanalım dijo

    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.

  5.   Hadi Linux kullanalım dijo

    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.

  6.   @hayalhanemersin dijo

    İ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.

  7.   Hadi Linux kullanalım dijo

    TAMAM. Aklımda tutarım.
    Şerefe! Paul.

  8.   Hadi Linux kullanalım dijo

    Çalıştığına sevindim. Her zaman ilginç ve pratik olabileceğini düşündüğüm şeyler göndermeye çalışırım.
    Sarılmak! Paul.

  9.   Felix Manuel Brito Amarante dijo

    İ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 *. *

  10.   diex02 dijo

    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.

  11.   Joe di castro dijo

    "Bang line" ı hiç duymamıştım, onu her zaman Shebang olarak biliyordum

    http://en.wikipedia.org/wiki/Shebang_%28Unix%29

    selamlar

  12.   Jonathan Fernandez dijo

    ilginç not… teşekkür ederim!

  13.   eM eM dijo

    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.

  14.   Mario raimondi dijo

    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.

  15.   ero-sennin dijo

    Ç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!

  16.   güç dijo

    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

  17.   Hadi Linux kullanalım dijo

    Teşekkürler Jonathan! Yorum yaptığınızı görmek güzel!
    Şerefe! Paul.

  18.   antonio dijo

    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

    1.    hadi linux kullanalım dijo

      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.

  19.   David M.M. dijo

    Çok güzel gönderi.
    Özellikle bu yazıda ortaya çıkan soru / şüphenin çok net ve kısaca yanıtlanmasını çok beğendim.