.Sh dosyalarını çalıştırmadan önce neden sh koymam gerekiyor?


16

.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ı?


3
Kabuk betiklerimi içine koymak ve $ PATH benim koymak için ~ / bin bir klasör yaptım ve ayrıca yapmak çok kolay unutulmaz çünkü yürütme izinlerini ayarlamak için ~ / bin klasörüne bir Klasör Eylem ekledi.
Kaydell

Yanıtlar:


22

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

Koy '.' $ PATH sonunda başlangıç ​​yerine ve şimdi bir hayalet 'ls' için endişelenmenize gerek yok. (Birisi sisteminize
girebilse

2
@TJ ama do gibi şeylere endişe gerekir 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!
Reid

@TJLuoma @Reid ne söyledi, ayrıca Unix sistemi için kişisel OS X masaüstünün ötesinde birçok kullanım durumu olduğunu unutmayın. Denemedim, ancak konuk hesabı bile bu öğelerden birini /tmpveya başka bir dünya yazılabilir dizininde bırakabilir .
zigg

Başkalarının kullandığınız dizinlere erişebildiği bir sistem kullanıyorsanız, daha büyük sorunlarınız olur.
TJ Luoma

@TJLuoma Herhangi bir Unix sisteminde asla birden fazla hesap kullanmamalısınız. /tmpvd. bölge ile gel.
zigg

10

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:

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

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


Zarar vermese de, çeteler aslında gerekli /bin/shdeğildir.
zigg

@zigg - Haklısın. Umarım Chris düzenlemelerime aldırmaz… Nuke ya da istediğin gibi yeniden düzenle: -0
bmike

@bmike Düzenlemeler benim için çalışıyor. Shebangs gelince, alışkanlığım her zaman belirtmekti çünkü kshHP- UX'de günlerimde çok sayıda komut dosyası yazıyordum - ama kesinlikle gerekli olmadığını bilmek güzel.
Chris W. Rea

1
Ben (benim cevap geri kalanı hala duruyor olsa da) shebang gerekliliği hakkında daha önceki açıklamamdan geri çekilmesi gerektiğini düşünüyorum. Bir kabuktan bir shebang-less komut dosyası çalıştırabilirsiniz, ancak bir execsyscall kullanırsanız , ENOEXEC(exec format hatası ). Üzgünüm, @bmike, @ ChrisW.Rea. Şimdi cevabımı düzenleyeceğim.
zigg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.