.shTerminal'de dosya çalıştırmak istediğimde shönlerine koymam gerekiyor.
Bundan kaçınmanın ve böylece yazmayı kaydetmenin bir yolu var mı?
.shTerminal'de dosya çalıştırmak istediğimde shönlerine koymam gerekiyor.
Bundan kaçınmanın ve böylece yazmayı kaydetmenin bir yolu var mı?
Yanıtlar:
Senaryonuzu kabuktan çalıştırıyorsanız, aslında bu cevapta#!/bin/sh belirtildiği gibi bir shebang'a ihtiyacınız yoktur - OS X dahil olmak üzere kullandığım her Unix benzeri sistem, herhangi bir tercüman özellikle belirtilmemişse varsayılan olarak ( ancak, kabuklar olmayanlar, siz shebang vermedikçe betiğinizi nasıl çalıştıracağınızı bilmeyeceği için iyi bir fikirdir.)/bin/sh
Ayrıca bir .shuzantıya ihtiyacınız yoktur . Sen yapmak örn yürütülebilir izinleri, ayarlama ihtiyacını
$ chmod +x script.sh
( $Kabuk istemidir; etkileşimli kabuğa verdiğiniz komutları göstermek için kullanıyorum. Yazmayın!)
Ancak, karışıklığınızın ne olduğunu, örneğin script.shgeçerli dizinde bir komut dosyası oluşturduğunuzu ve sadece yazarak çalıştırmaya çalıştığınızı düşünüyorum script.sh. Örneğin
$ cat >script.sh
echo hello, world
^D
$ chmod +x script.sh
$ script.sh
-bash: script.sh: command not found
( ^Danlamına gelir. control- DBu gösterimi Unix'i kullanma hakkındaki birçok yazımda bulacaksınız.)
Aslında script.shbu durumda bir kabuk sadece yarısı sorundur; asıl sorununuz, kabuğun varsayılan olarak geçerli dizinde bir program aramayacağıdır. Ancak, bu işe yarar:
$ sh script.sh
hello, world
çünkü shsenaryoyu argüman olarak alıyor.
Sen yine bir komut dosyası veya yürütebilirsiniz herhangi bunu (yani çalıştırılabilir işaretlenmiş ise, geçerli dizinde çalıştırılabilir- chmod +x) Eğer geçerli dizinde birini çalıştırmak istediğiniz belirterek,:
$ ./script.sh
hello, world
Ayrıca betiği üzerindeki bir dizine taşıyabilirsiniz PATH. /usr/local/binKomut dosyanızın sistem genelinde kullanılması amaçlanıyorsa veya binkomut dosyası yalnızca sizin içinse evinizdeki bir dizini öneririm . İkincisi $HOME/bin, yeni bin dizininize genişleyen , ana dizininize PATHaşağıdaki satırları ekleyerek şunu eklemenizi gerektirir .profile:
PATH=$HOME/bin:$PATH
export PATH
Son olarak, isterseniz, şu anki dizini gerçekte bilgisayarınıza ekleyebilirsiniz PATH, bu da script.sh–ve diğer yürütülebilir dosyaları içeren bir dizine gitmenize ve
$ script.sh
yürütmek için. Ancak, bu uygulamayı önermiyorum , çünkü bir saldırgan, lsiçinde çalışacağınız bir dizine yürütülebilir bir komut dosyası (adlandırılmış, adında) bırakarak keyfi bir çalıştırılabilir kandırmanıza neden olabilir . Gerçekten yapmak istiyorsanız, sadece aşağıdakileri ekleyin .profile:
PATH=.:$PATH
export PATH
slya llsya l... yani yazım hataları. .Dışarıda bırak $PATH. Ayrıca, sisteminizdeki herkese mutlaka güvenemeyebilirsiniz (veya etmemelisiniz). Örneğin, bazı bazı dizine keyfi bir dosya açılır, bir saldırganın verir istismar var herhalde, ama ihtiyaç duydukları sen iletin için bu dosyayı çalıştırmak için daha iyi bir istismar (örneğin toplamak veri ve telefon ana sayfa). Derinlemesine savunma!
/tmpveya başka bir dünya yazılabilir dizininde bırakabilir .
/tmpvd. bölge ile gel.
shKomut dosyası yürütülebilir olarak işaretlenmişse çağırmanız gerekmez . Bu durumda, mevcut kabuktan herhangi bir komutta yaptığınız gibi benim adım diyebilirsiniz.
Tamamen uygun olmak için iki şey yapmak isteyeceksiniz:
Komut dosyanızı, komut dosyanızın üst kısmına bir shebang yönergesi ekleyecek şekilde düzenleyin:
#!/bin/sh
... Kabuğa senaryoyu çalıştırmak için hangi tercümanı kullanacağını söylerdi; bu durumda, /bin/shyürütülebilir.
Olarak senaryoyu işaretle yürütülebilir ile tarafınızca chmod komutu:
chmod u+x scriptname.sh
Her ikisini de yaptıktan sonra, komut satırınıza komut dosyanızın dosya adını yazarak komut dosyanızı çalıştırabilmeniz gerekir. İçerdiği klasörü PATH değişkeninize eklemenin ek adımını atmadıkça, komut dosyanızla aynı dizinde olmanız gerekir . Komut dosyasını hangi kabuğun çalıştırdığını umursamıyorsanız, belirtmek shiçin birinci adıma ihtiyacınız yoktur, ancak kesin olmak ve "shebangsh" ı ayarlamak genellikle daha iyidir.
/bin/shdeğildir.
kshHP- UX'de günlerimde çok sayıda komut dosyası yazıyordum - ama kesinlikle gerekli olmadığını bilmek güzel.
execsyscall kullanırsanız , ENOEXEC(exec format hatası ). Üzgünüm, @bmike, @ ChrisW.Rea. Şimdi cevabımı düzenleyeceğim.