Terminal'de bir bash betiğini nasıl çalıştırırım?


108

Şunun gibi bir bash betiğim var:

#!/bin/bash

echo Hello world!

Bunu Terminal'de nasıl gerçekleştiririm?


27
Yürütme izinleri var mı? chmod +x scriptnameVe sonra deneyin ./scriptname.
dirkgently

Yanıtlar:


49

$prompt: /path/to/scriptve enter tuşuna basın. Komut dosyasının yürütme izinlerine sahip olduğundan emin olmanız gerektiğini unutmayın.


1
Zaten dizindeyseniz /path/to , örneğin cd /path/tokomutla, komut ./scriptdosyanızı çalıştırmak için girebilirsiniz. Unutmayın, bu durumda 'komut dosyasının' önündeki './'
FrViPofm


26

komut dosyasını içeren dizine cd yapın veya $ PATH'nizdeki bir bin klasörüne koyun.

sonra yazın

./scriptname.sh

aynı dizindeyse veya

scriptname.sh

bin klasöründeyse.


9
Bu, yalnızca komut dosyası yürütme bit setine sahipse çalışır. Muhtemelen ele alınması gerekiyor.
Bryan Oakley

./scriptname.shbenim için çalışıyor ama scriptname.shveriyor scriptname.sh: command not found. -rwxr-xr-xizinleridir.
Spikatrix

1
cdHerhangi bir yere verilen tavsiye, yeni başlayanlar için başka bir yaygın yanlış anlamaya yol açar . Betiğin dahili olarak belirli bir dizinde çalışmasını gerektiren bağımlılıkları olmadığı sürece (komut dosyasının açıklanamaz bir şekilde işaret etme seçeneği sunmadığı bir veri dosyasını okuma ihtiyacı gibi), cdonu çalıştırmak için hiçbir yere ihtiyaç duymamalısınız ve çok genellikle istemeyecektir.
üçlü

24

Yapabilirsin:
sh scriptname.sh


6
Olumsuz oy: Doğru bir Bash betiğiyse bu yanlıştır.
üçlü

1
Olumlu oy: Bash komut dosyanız aynı dizindeyse Mac OS X'te sorun değil
Karl Taylor

30
@kot "Benim için işe yarıyor", "bu doğru bir cevap" dan çok uzak. Bu olabilir eğer çalışmak shiçin sembolik bağdır bash, veya komut dosyası herhangi Bash özgü yapısını kullanmadığı takdirde. İlk durumda, bashbunun yerine kullanmak shtek doğru, taşınabilir çözümdür; ikinci durumda, bu belirli sorunun doğru cevabı bu değildir, çünkü OP özellikle bir Bash betiği için tavsiye sormuştur. Yanlış cevabı vermek sorumsuzluktur; farkı kavrayamayan kullanıcılar sık ​​sık burada yayınlıyor ve bu "benim için çalıştı" cevabının neden onlar için işe yaramadığını göstermesi gerekiyor.
2016

@kraftydevil too ^ Bu konuyla ilgili birkaç popüler yinelenen hedeften biri: stackoverflow.com/questions/5725296/…
2016

5
@kot Tekrar ediyorum: Bunun işe yaradığı durumlar var (tıpkı sizin öğrendiğiniz gibi) ama genel olarak başlıktaki soruya doğru bir cevap değil. En azından bu cevap, çalıştığı koşulları açıklamalıdır; ama benim önerim bu yanıtı basitçe silmek olacaktır.
üçlü

14

Öncelikle bunu kullanarak çalıştırılabilir yapmak zorunda: chmod +x name_of_your_file_script.

Çalıştırılabilir hale getirdikten sonra, bunu kullanarak çalıştırabilirsiniz. ./same_name_of_your_file_script


10

Cd komutunu kullanarak dizininizi komut dosyasının bulunduğu yere değiştirin

Sonra yazın

bash program-name.sh

6
Hiçbir cdyere gerek yok ; argüman olarak rastgele karmaşık bir yol adı belirtebilirsiniz bash; aslında, bir dosya adı argümanı alan herhangi bir program bu şekilde çalışır (veya korkunç bir şekilde, zihninizi uyuşturacak şekilde bozulur).
2016

10

Bu eski bir konu, ama bununla karşılaştım ve kimsenin henüz tam bir cevap vermemesine şaşırdım. İşte başlıyor ...

Bir Komut Satırı Komut Dosyası Çalıştırma Eğitimi!

S: Bunu Terminal'de nasıl gerçekleştiririm?

Karışıklık ve Çatışmalar:

  • Sen do not (.SH veya .py ya da bir şey başka benzeri) bir 'uzantı' gerekir, ancak bu işleri takip tutmaya yardımcı olur. Acıtmaz. Ancak komut dosyası adı bir uzantı içeriyorsa, onu kullanmanız gerekir.
  • Sen do not herhangi bir nedenle hiç bir kesin dizinde olması gerekir.
  • Sen do not sen istemedikçe dosyası (BASH veya Python ya neyse) çalışan programın adını yazmanız gerekir. Acıtmaz.
  • Bunların hiçbirini yapmanıza gerek sudoyok. Bu komut, komutları başka bir kullanıcı veya bir 'kök' (yönetici) kullanıcı olarak çalıştırmak için ayrılmıştır. Burada harika bir gönderi .

(Komut dosyalarının nasıl çalıştırılacağını yeni öğrenen bir kişi, yeni bir program yüklemek gibi gerçek bir ihtiyaç olmadığı sürece bu komutu kullanmamalıdır. Komut dosyalarınızı koymak için iyi bir yer ~ / bin klasörünüzdedir. Oraya şuradan ulaşabilirsiniz yazarak cd ~/binveya cd $HOME/binterminal komut isteminden. Bu klasörde tam izinlere sahip olacaksınız.)

Unix / Linux tipi bir sistemdeki terminalden "bu komut dosyasını çalıştırmak" için üç şey yapmanız gerekir:

  1. Sisteme komut dosyasının yerini söyleyin. (birini seçin)

    • Komut dosyası adıyla birlikte tam yolu yazın (örn. /path/to/script.sh). Tam yolu terminale yazarak pwdveya girerek doğrulayabilirsiniz echo $PWD.
    • Aynı dizinden çalıştırın ve ./yol için kullanın (örn. ./script.sh). Kolay.
    • Komut dosyasını sistemdeki bir dizine yerleştirin PATHve sadece adı yazın (örn. script.sh). Sistemi PATHyazarak echo $PATHveya echo -e ${PATH//:/\\n}daha düzgün bir liste istiyorsanız doğrulayabilirsiniz .
  2. Sisteme betiğin yürütme iznine sahip olduğunu söyleyin. (birini seçin)

    • chmod +x /path/to/script.shTerminale yazarak "yürütme bitini" ayarlayın .
    • chmod 755 /path/to/script.shNumaraları tercih ederseniz de kullanabilirsiniz . Burada harika bir tabloyla harika bir tartışma var .
  3. Sisteme komut dosyası türünü söyleyin. (birini seçin)

    • Komut dosyasından önce programın adını yazın. (örneğin BASH /path/to/script.shveya PHP /path/to/script.php) Komut dosyasının .php veya .py gibi bir uzantısı varsa, komut dosyası adının bir parçasıdır ve onu eklemeniz gerekir.
    • Örneğinizde ( #!/bin/bash) olduğunu gördüğüm bir shebang kullanın . Betiğinizin ilk satırı buna sahipseniz, sistem betiği çalıştırmak için bu programı kullanır. Program yazmaya veya uzantı kullanmaya gerek yok.
    • "Taşınabilir" kullanın shebang . Sistemin programın ilk versiyonunu PATHkullanarak ve #!/usr/bin/envardından program adını (örneğin #!/usr/bin/env bashveya #!/usr/bin/env python3) seçmesini de sağlayabilirsiniz . Burada ayrıntılı olarak tartışıldığı gibi artıları ve eksileri var .

1
Oldukça iyi bir özet. Belki son örnekte insanlara hatırlatmak script.shve script.phpbu komut değişmez dosya adları vardır ve dosya adında bir uzantısı koyarsanız o, size tersi senaryoyu (ve yardımcısı çalıştırdığınızda eklemenize gerek; komut gelmez' eğer Bir uzantınız var, bir tane koymayın). Bu, dosya adından .batveya .exeadından çıkarabileceğiniz DOS'tan farklıdır ve yürütülebilir olarak kabul edilmeleri için küçük bir kümeden bir uzantıya sahip olması gerekir.
üçlü

1
Diğer bir yaygın acemi hata arasındaki farkı yanlış anlama olduğunu path, /path, ./pathve ~/path. Sanırım muhtemelen burada açıklamak istemiyorsunuz, ama belki bir açıklamaya bağlantı verebilirsiniz ... oh dang, bunu göndermek zorunda kaldım .
üçlü

1

Ve yine bir yol daha

. /path/to/script

Noktanın anlamı nedir?


Bu, çağrılması gereken betiği mevcut kabukta çalıştırır. Bu, çoğu insanın basitçe bir komut dosyası çalıştırdığınızda olmasını beklediği şey değildir. Bunun mevcut ortamınız üzerinde yan etkileri olabilir.
Yazılım Mühendisi

-2

Komut dosyasının bulunduğu bir dizin veya klasördeyseniz, dosya iznini çalıştırılabilir modda değiştirerek

chmod +x your_filename.sh

Bundan sonra aşağıdaki komutu kullanarak betiği çalıştıracaksınız.

$ sudo ./your_filename.sh

Yukarıda "." mevcut dizini temsil eder. Not! Bash betiğinin bulunduğu dizinde değilseniz, bu durumda dosyanın bulunduğu dizini kullanarak değiştirirsiniz.

cd Directory_name/write the complete path

komut. Aksi takdirde betiğiniz çalışamaz.


Umarım herkes bunu yapar, çünkü bu özel problemle ilgili tüm kavramlardan bahsediyorum.
Hassan Shamshir

Buradaki diğer cevaplarda açıklandığı gibi, gereksiz yere verdiğiniz yetkileri kötüye kullanan güvenilmeyen bir senaryoda kullanırsanız sudo, yanlış ve potansiyel olarak korkunç derecede yanlıştır .
üçlü

Bir cdyere verilen tavsiyeyi anlamak zor, ama muhtemelen yanlış da.
üçlü
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.