.sh
Terminal'de dosya çalıştırmak istediğimde sh
önlerine koymam gerekiyor.
Bundan kaçınmanın ve böylece yazmayı kaydetmenin bir yolu var mı?
.sh
Terminal'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 .sh
uzantı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.sh
geç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
( ^D
anlamına gelir. control- DBu gösterimi Unix'i kullanma hakkındaki birçok yazımda bulacaksınız.)
Aslında script.sh
bu 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ü sh
senaryoyu 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/bin
Komut dosyanızın sistem genelinde kullanılması amaçlanıyorsa veya bin
komut dosyası yalnızca sizin içinse evinizdeki bir dizini öneririm . İkincisi $HOME/bin
, yeni bin dizininize genişleyen , ana dizininize PATH
aş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, ls
iç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
sl
ya lls
ya 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!
/tmp
veya başka bir dünya yazılabilir dizininde bırakabilir .
/tmp
vd. bölge ile gel.
sh
Komut 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/sh
yü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 sh
için birinci adıma ihtiyacınız yoktur, ancak kesin olmak ve "shebangsh" ı ayarlamak genellikle daha iyidir.
/bin/sh
değildir.
ksh
HP- UX'de günlerimde çok sayıda komut dosyası yazıyordum - ama kesinlikle gerekli olmadığını bilmek güzel.
exec
syscall kullanırsanız , ENOEXEC
(exec format hatası ). Üzgünüm, @bmike, @ ChrisW.Rea. Şimdi cevabımı düzenleyeceğim.