Basit bir senaryo yazdım. Çalıştırdığımda sh <myscriptname.sh>
doğru çıktıyı aldım, fakat çalıştırdığımda ./<myscriptname.sh>
bir hatayla karşılaştım.
Yaptığım zaman sh
ve arasındaki fark nedir ./
?
Basit bir senaryo yazdım. Çalıştırdığımda sh <myscriptname.sh>
doğru çıktıyı aldım, fakat çalıştırdığımda ./<myscriptname.sh>
bir hatayla karşılaştım.
Yaptığım zaman sh
ve arasındaki fark nedir ./
?
Yanıtlar:
Herhangi bir komut dosyasını dosya adını komut dosyası tercüman programına ileterek çalıştırdığınızda, tercüman programını komut dosyasıyla, kendisine aktarılan bir argüman olarak çalıştırıyorsunuzdur. Örneğin, bu 'sh' işlemi ile 'dosyaadı.sh' argümanına benziyor. sh
Tercüman dosyasını açıyor.
Öte yandan, komut dosyasını kendiniz çalıştırırsanız, sistem belirtilen tercüman programına çağrı yapar ve komut dosyalarının içeriğini besler. Bu durumda, işlem argüman olmadan 'dosyaadı.sh' gibi görünür.
Patlama çizgisi olduğundan emin olmalısın:
#!/bin/bash
# bash script here
Bir komut satırı , komut dosyasındaki ilk satırdır ve aynı iki karakterle başlar #!
, bunlar komut dosyasını çalıştırmaya çalıştığında sistemin okuduğu şeydir ve sistem komut dosyasını derhal programa geçirir. 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. #!/usr/bin/python
Örneğin kullanır ve sonra python kodunu izlersiniz.
Komut dosyanızı aldıktan sonra, yürütme izinlerini ayarladığınızdan emin olun:
chmod a+x filename.sh
Sonra betiği kendi işlemi olarak çalıştırabilirsiniz:
./filename.sh
Veya dosyayı güzel bir program adıyla bilinen bir konuma yerleştirin, ister /usr/sbin
ve istediğiniz yerden çalıştırın:
sudo cp filename.sh /usr/sbin/program-name
program-name
Ve bu gerçekten de bang hattını doğru izinlerle kullanmanın pratik yararıdır - hepsi konuşlandırma ile ilgilidir . Betiği hangi programla çalıştıracaklarını hatırlamaları gerekirse, kullanıcıların bir betiği çalıştırmalarını sağlamak çok zordur. Her çalıştırmak istediklerinde komut dosyasına tam bir yol vermeyi unutmayın. Nerede koyarak olarak /usr/local/bin
örneğin ve yürütülebilir yapma, Senaryonu kullanmaya çalışan insanlar için keder çok şey kaydedebilirsiniz. Bu programlar daha sonra bilgisayarınızdaki tüm kullanıcılar için uygun hale gelir .
Aynı zamanda tanımlama için iyi. Eğer içine giderseniz top
programda, patlama hattı olmayan bir senaryo çalıştırmak sadece tercüman yani adı olacaktır bash
, perl
ya da python
. Ancak bir komut dosyası doğru izinlerle çalıştırılıyorsa, komut dosyasının adı gösterilir.
Not: Herkese açık bir betiği dağıtmak istiyorsanız, lütfen yüklemek için bir adam sayfası ve bir deb paketi oluşturun. Çevrimiçi olarak rastgele komut dosyalarının sayısını azaltmamız ve kaldırılabilecek dosya sayısını arttırmamız gerekiyor.
bash
olmadığını unutmayın sh
.
PATH
.
/usr/local/bin
o zaman muhtemelen daha iyidir /usr/sbin
- programın dağıtımın bir parçası olmak yerine bu makinede yerel olduğunu gösterir.
Kısa versiyon:
sh
komut satırı yorumlayıcısıdır (çizgi).
Koşmak sh my_script
dash'in betiği yorumlamasını sağlar.
./
Hangi tercümanın kullanılacağını ilk satıra bakarak bulmaya çalışır. Örneğin #!/bin/bash
, hatta #!/bin/ruby
(koşmanın aksine ruby my_script
).
./
şey bulamaz, dosyanın ilk iki baytına bakan sistem yürütme yöntemidir.
sh
ve dosya bir sha-bang içeriyorsa, bu sha-bang'in yoksayılacağı anlamına mı geliyor, yoksa sh
bağlantıların da açılacağı anlamına gelir ve sonra belki başka bir kabuk veya ne işe yarar :)?
Yaptığın fark,
ile sh
bunu size terminalin interaktif isteminde bunları yazmış olurdu gibi komut dosyanızda çizgileri yorumlayacaktır bir program çalıştırıyorsanız,
ile ./
komut dosyası size oturuyorsun VE (örneğin size verilen çünkü çalıştırılabilir olacak geçerli dizinde sadece burada olduğunu varsayarak bir kısayol yapıyoruz chmod +x myscript.sh
:-) gelecek zamanlar için size çok değerli zamandan tasarruf)
sh
Dosya ile mutlaka çalıştırılabilir olması gerekmediğini unutmayın .
Hata yapmanın üç ana nedeni vardır:
chmod +x <myscriptname.sh>
noexec
" eklenmiş ) /usr/local/bin
#!
hat bir hata vardır #!/bin/sh
veya#!/bin/bash
İlk satırınız düzgün görünüyorsa, ancak hala çalışmıyorsa, dosyanın DOS satırı sonları olmadığından emin olun.
Hata şöyle bir şeye benzeyebilir:
$ ./myscript.sh
bash: ./myscript.sh: /bin/bash^M: bad interpreter: No such file or directory
Sen çalıştırarak tamir edebiliriz dos2unix <myscriptname.sh>
bunu yoksa, ya da
perl -p -i -e 's/\r\n$/\n/' <myscriptname.sh>
.
Cevap şu ki, sh çok popüler bir kabuk için isimdir. Ama modası geçmiş ve başkaları tarafından değiştirildi. Günümüzde sh makinede kurulu diğer mermilerle bağlantılıdır. Mesela oraya bir bash koydum. Herhangi bir kabuğun sh'den çalıştırılması genellikle orijinal 'kabuk' davranışı ile bazı 'uyumluluk' modlarını tetikler.
Yani çözüm oldukça basit. Sh komutunun arkasında ne olduğuna bakın (ls -al / bin / sh) ve #! / Bin / whatever_you_find_there'yi ilk satır olarak koyun (veya komut dosyanızda buna benzer bir şey varsa düzenleyin).
Alternatif olarak, betiğin kendisinde bir hata olabilir. Sh tarafından karşılanan, ancak gerçekten kullanılan tercüman olmayan bağımlılık gibi.
mkdir ~/bin ; cp myscript.sh ~/bin/
echo "export PATH="$PATH:/home/$USER/bin" >> ~/.profile ; source ~/.profile ;
Değil /usr/sbin
, bu gerekli olmayan idari araçlar için, /usr/local/bin
eğer sahip olmak istemezseniz daha iyi bir seçim olabilir ~/bin/
, ancak sudo
mümkün olduğunca kaçınmanız tavsiye edilir.
~/.profile
zaten ~/bin
varsa ekleme kodunu içerir PATH
. Başka bir notta, komut dosyalarına uzantı eklemeyin.
ls ~/bin/|wc -l = 428
) Oraya pek çok şey koydum;)
/bin
ve /usr/bin
onlar uzantıları kullanmayın göreceksiniz.