Bir betiği çalıştırmak için ./ ve sh arasındaki fark nedir?

65

Basit bir senaryo yazdım. % Co_de% çalıştırdığımda, doğru çıktı aldım, ancak sh <myscriptname.sh> çalıştırdığımda bir hata oluştu.

./<myscriptname.sh> ve sh ne zaman yaptığım arasındaki fark nedir?

    
sordu mr_eclair 23.01.2011 16:16

6 cevap

62

Dosya adını komut dosyası yorumlayıcı programına ileterek herhangi bir komut dosyasını çalıştırdığınızda, çevirmen programını betik içine aktarılan bir argüman olarak çalıştırıyorsunuz. Örneğin, bu 'filename.sh' argümanı ile 'sh' sürecine benzeyecektir. % Co_de% yorumlayıcısı dosyayı açıyor.

Öte yandan, senaryonun kendisini çalıştırırsanız, sistem belirtilen yorumlayıcı programına çağrı yapar ve komut dosyalarının içeriklerini besler. Bu durumda süreç, argümanlar olmadan 'filename.sh' gibi görünür.

Bir patlama çizginiz olduğundan emin olmalısınız:

#!/bin/bash
# bash script here

Bir komut satırı komut dosyasında çok ilk satır ve aynı karakter sh ile başlar, bunlar komut dosyasını yürütmeye çalıştığında sistem okur ve sonra sistem geçer hemen sonra programa komut dosyası. Bu çizginin bash ile ilgisi olmadığını ve çok farklı diller olmasına rağmen python ve perl için de iyi çalıştığını unutmayın. Örneğin #! kullanırsınız ve ardından python koduyla takip edersiniz.

Komut dosyanızı aldıktan sonra, yürütme izinlerini ayarladığınızdan emin olun:

chmod a+x filename.sh

Ardından, komut dosyasını kendi işlemi olarak çalıştırabilirsiniz:

./filename.sh

Veya dosyayı #!/usr/bin/python gibi güzel bir program adıyla bilinen bir konuma yerleştirin ve her yerden çalıştırın:

sudo cp filename.sh /usr/sbin/program-name
program-name

Ve bu, bang satırını doğru izinlerle kullanmanın gerçekten pratik faydasıdır - her şey dağıtım ile ilgilidir. Kullanıcıların, betiği çalıştıracak programı hatırlamak zorunda kalmaları durumunda bir betik çalıştırmaları çok zor. Komutu çalıştırmak istedikleri her zaman tam bir yol vermeyi unutmayın. Örneğin,% co_de yüzdesini koyarken ve onu çalıştırılabilir hale getirmek, komut dosyanızı kullanmaya çalışan insanlar için çok fazla keder kurtarabilir. Bu programlar daha sonra bilgisayarınızdaki tüm kullanıcılara sunulur.

Ayrıca tanımlama için iyidir. % Co_de% programına girerseniz, bang çizgisi olmadan çalıştırılan bir betik, yalnızca yorumlayıcı adına, yani /usr/sbin , /usr/local/bin veya top değerine sahip olacaktır. Ancak bir komut dosyası doğru izinlerle çalıştırılırsa, komut dosyasının adı gösterilir.

Not: Herkes tarafından erişilebilen bir komut dosyası dağıtmak istiyorsanız, lütfen yüklemek için bir erkek sayfa ve bir borç paketi oluşturun. Rastgele komut dosyalarının sayısını çevrimiçi olarak azaltmalı ve kaldırılabilen debi sayısını artırmalıyız.

    
verilen cevap Martin Owens -doctormo- 23.01.2011 16:31
37

Kısa versiyon:

  • sh , komut satırı yorumlayıcısıdır (dash).
    sh my_script çalıştırılıyor komut dosyasını tire ile yorumluyor.

  • ./ , hangi çeviricinin kullanılacağını bulmaya çalışır, ilk çizgiye bakarak. Örneğin. #!/bin/bash , hatta #!/bin/ruby ( ruby my_script çalışmasına karşılık olarak).

verilen cevap Stefano Palazzo 23.01.2011 16:44
3

Yaptığınız fark,

  • sh ile, betikteki satırları yorumlayacağınız bir program çalıştırıyorsunuz, tıpkı terminalin etkileşimli isteminde yazdığınız gibi,

  • ./ ile, komut dizininin içinde bulunduğunuz dizinde tam olarak burada olduğunu varsayarak bir kısayol oluşturuyorsunuz. VE çalıştırılabilir olacak (örneğin chmod +x myscript.sh verdiğiniz için), gelecek zamanlar için çok değerli zamanlar: -)

verilen cevap meduz 23.01.2011 23:13
3

Bir hatayla karşılaşmanızın üç ana nedeni vardır:

  • dosya yürütülebilir değil
    Bunu düzeltmek için chmod +x <myscriptname.sh> çalıştır
  • bölüm, komut dosyalarını çalıştırmaya izin vermiyor (" noexec " adlı birime monte edildi)
    komut dosyasını /usr/local/bin kopyalayın
  • #! satırında bir hata var
    ilk satırın #!/bin/sh veya #!/bin/bash olduğundan emin olun

İlk satırınız doğru görünüyorsa, ancak hala çalışmıyorsa, dosyanın DOS satır sonu olmadığından emin olun.

Hata böyle bir şeye benziyordu:

$ ./myscript.sh
bash: ./myscript.sh: /bin/bash^M: bad interpreter: No such file or directory

dos2unix <myscriptname.sh> dosyasını çalıştırarak veya bunu yapmadıysanız,% perl -p -i -e 's/\r\n$/\n/' <myscriptname.sh> 'ı kullanarak düzeltebilirsiniz.

    
verilen cevap Mikel 03.02.2011 23:03
0

Ve cevap şu ki, sh çok popüler kabuk için bir isim. Ama modası geçmiş ve başkaları tarafından değiştirildi. Günümüzde, makine üzerinde kurulu olan diğer kabuklarla bağlantılıdır. Örneğin. Orada putu var. Herhangi bir kabuğun sh'den çalıştırılması, genellikle 'kabuk' davranışıyla 'uyumluluk' modunu tetikler.

Yani çözüm oldukça basit. Sh komutunun arkasına bak (ls -al / bin / sh) ve ilk satır olarak #! / Bin / whatever_you_find_there komutunu yazınız (ya da betiğinizde böyle bir şey varsa).

Ve alternatif olarak betiğin kendisinde de bazı hatalar olabilir. Şunun yerine getirdiği bağımlılık gibi, ama aslında kullanılan yorumlayıcı değil.

    
verilen cevap przemo_li 23.01.2011 18:09
0
mkdir ~/bin ; cp myscript.sh ~/bin/

echo "export PATH="$PATH:/home/$USER/bin" >> ~/.profile ; source ~/.profile ; 

/usr/sbin değil, bu gerekli olmayan yönetim araçları için /usr/local/bin , co_de% 'sine sahip olmak istemiyorsanız, ~/bin/ daha iyi bir seçimdir, ancak sudo Mümkün olan tavsiye edilir.

    
verilen cevap Joey1978 24.01.2011 08:25

Etiketlerdeki diğer soruları oku