“Sh” veya “bash” komutlarını kullanmadan bir kabuk komut dosyasını nasıl çalıştırabilirim?


261

"Sh" veya "bash" komutlarını kullanmadan çalıştırmak istediğim bir kabuk komut dosyası var. Örneğin:

Onun yerine: sh script.sh

Kullanmak istiyorum: script.sh

Bunu nasıl yapabilirim?

PS (i) Kabuk betiğini fazla kullanmıyorum ve takma adlar hakkında okumaya çalıştım, ancak bunları nasıl kullanacağımı anlamadım.

(ii) Senaryoyu PATH değişkenlerindeki başka bir dosyaya bağlamayı da okudum. Üniversite sunucumu kullanıyorum ve bu konumlarda dosya oluşturma iznim yok.


1
Yanıtlar, komut dosyasının nasıl çalıştırılacağını gösterir, ancak nasıl erişilebilir hale getirileceğini kapsamaz. Bunun için kendinize bir bin dizini oluşturun - $HOME/bin- henüz bir dizininiz yoksa PATH'nize ekleyin (ön tarafa yakın). Buraya yol adını belirtmeden doğrudan yürütmek istediğiniz komut dosyalarını (ve diğer programları) veya gerçek programların bulunduğu yere sembolik bağlantıları koyun.
Jonathan Leffler

1
Aşağıdaki yanıt (lar) ı izledikten sonra, ".sh" dosyasını bırakmak için dosyayı yeniden adlandırabilirsiniz: mv example.sh exampleve sonra examplekendi başına çalışmalıdır.
PJ Brunet

Yanıtlar:


434

Dosyanızın üst kısmına "shebang" ekleyin:

#!/bin/bash

Ve dosyanızı yürütülebilir ( chmod +x script.sh) yapın.

Son olarak, komut dosyanızın bulunduğu dizini eklemek için yolunuzu değiştirin:

export PATH=$PATH:/appropriate/directory

(genellikle $HOME/binkendi komut dosyalarınızı saklamak istiyorsunuz )


Hey cevabınız için teşekkürler. Bunu denedim. Şimdi "sh" komutu olmadan çalıştırabilirim. Ama yine de komutun önüne istemediğim "./" yazmalıyım. :)
Rameez Hussain

5
Yol hakkındaki yorumlara bakın. Senaryonuzu PATH'inize eklemeniz gereken bir dizine koymanız gerekir.
fge

2
benim durumumda işe yaramadı. ama iyi source script.shçalıştı, ya da daha doğrusu source <filename_without_any_extension_type>
MycrofD

4
source ./my-cool-script(veya . ./my-cool-script) geçerli kabuk oturumunu kodda tanımlanan değişkenlerle kirletir. Ortam değişkenlerini ayarlayarak, dizini vb. Değiştirerek kabuk oturumunu açıkça değiştirmek istemediğiniz sürece kaynak kullanımı kullanılmamalıdır. Aksi takdirde, bir komut dosyası yürütme değişkenleri, kaynak yoluyla yapılırsa, başka bir komut dosyası yürütmesini etkileyebileceğinden, gerçekten korkunç hatalar oluşabilir.
Daniel Waltrip

3
Komut dosyası klasörünün PATH içinde olduğundan eminseniz ve bu olmadan da çalışmazsa ./, bir ad çakışması olabilir. Yeniden adlandırmayı deneyin.
chorbs

66

Bunlar, komut dosyası adını doğrudan kullanmanın ön koşullarından bazılarıdır:

  1. she-bang (#!/bin/bash)Çizgiyi en üste ekleyin .
  2. chmod u+x scriptnameKomut dosyasını yürütülebilir hale getirmek için kullanma . ( scriptnamebetiğinizin adı nerede )
  3. Komut dosyasını /usr/local/binklasörün altına yerleştirin .
  4. Komut dosyasını yalnızca komut dosyasının adını kullanarak çalıştırın.

Not:/usr/local/bin Klasörün altına yerleştirmeyi önermemin nedeni , büyük olasılıkla zaten yolunuza eklenecek yol olmasıdır PATH variable.

Güncelleme:

/usr/local/binKlasöre erişiminiz yoksa aşağıdakileri yapın:

  1. Ana dizininizde bir klasör oluşturun ve diyelim myscripts.
  2. Yapmak ls -lart Kabuk kullandığı başlangıç komut dosyasını tanımlamak için, ev dizininde. Olmalı ya .profileda .bashrc.
  3. Başlangıç ​​komut dosyasını belirledikten sonra, komut dosyanıza şu satırı ekleyin - export set PATH=$PATH:~/myscript.
  4. Eklendikten sonra, başlangıç ​​komut dosyanızı kaynaklayın veya oturumu kapatın ve tekrar oturum açın.
  5. Komut dosyanızı kullanarak çalıştırın scriptname.

Bunu yapmayı denedim ama / usr / local / bin klasörüne erişim izinlerine sahip değilim. Üniversite bilgisayar kullanıyorum.
Rameez Hussain

1
"Başlangıç ​​betiğini kaynakla" ile ne demek istediğini söyleyebilir misin?
Rameez Hussain

1
Başlangıç ​​komut dosyasının kaynaklanması, yeni ayarlanan parametrenin PATH değişkenine kabuk tarafından alınması için yürütülmesi anlamına gelir. Bu yapılarak yapılabilir . .bashrc. Yani, sadece .onu spaceve ardından başlangıç ​​komut dosyası adınızı koyun.
jaypal singh

Sistemdeki sorunun ne olduğunu bilmiyorum. İçinde sadece "yankı" merhaba "" olan "merhaba" adında yeni bir kabuk betiği oluşturdum. İzinlerini değiştirdim ve ./hello denedim. Çalışmıyor. diyor
Rameez Hussain

Başlangıç ​​komut dosyalarınızda ne gibi değişiklikler yaptınız?
jaypal singh

20

Sadece çalıştırılabilir olduğundan emin olun chmod +x. Varsayılan olarak, geçerli dizin PATH'nizde değildir, bu nedenle dizini ./script.sh- olarak çalıştırmanız veya başka bir şekilde nitelikli bir yolla başvurmanız gerekir . Alternatif olarak, gerçekten ihtiyacınız varsa script.sh, bunu PATH'nize eklemeniz gerekir. (Sistem yolunu değiştirme erişiminiz olmayabilir, ancak kendi ortamınızın PATH'sini neredeyse kesinlikle değiştirebilirsiniz.) Bu ayrıca komut dosyanızın şöyle bir şeyle başladığını varsayar.#!/bin/sh .

Ayrıca, kabuk komut dosyası oluşturma ile gerçekten ilgili olmayan, yalnızca kabukla ilişkili olan ve aşağıdaki gibi basit bir takma ad da kullanabilirsiniz:

alias script.sh='sh script.sh'

Hangi yerine sadece script.sh(kelimenin tam anlamıyla - bu başka bir *.shdosya için çalışmaz ) kullanmanıza izin verir sh script.sh.


Hey! Cevabın için teşekkürler. Daha önce takma adları kullanmayı denedim. Ama hiçbir şey olmadı. Hemen "#! / Usr / local / bin / bash" satırından sonra yerleştirdim. Neyin yanlış olduğunu düşünüyorsun?
Rameez Hussain

1
Kodunuzda bir takma ad tanımlanamaz - geçerli ortamınızın bir parçası olarak bildirilmelidir. Bu yüzden, sadece aliaskomut satırında komutu çalıştırın , ve sonra komutu çalıştırmak için diğer ad kullanılabilir olacaktır.
ziesemer

17

Bu örnekte dosya çağrılır myShell

Her şeyden önce bu dosyayı yapmamız gerekecek, aşağıdakileri yazarak başlayabiliriz:

sudo nano myShell

Biz koymadı Bildirimi .shuzantısı? Çünkü terminalden çalıştırdığımızda sadece yazmamız gerekecekmyShell komutumuzu çalıştırmak için yazmamız !

Şimdi, nano'da üst satır OLMALIDIR, #!/bin/basho zaman devam etmeden önce yeni bir satır bırakabilirsiniz.

Gösteri için temel bir Hello World!cevap ekleyeceğim

Bu yüzden aşağıdakileri yazıyorum:

echo Hello World!

Bundan sonra örneğim şöyle görünmelidir:

#!/bin/bash
echo Hello World!

Şimdi dosyayı kaydedin ve şu komutu çalıştırın:

sudo chmod +x myShell

Şimdi dosyayı çalıştırılabilir hale getirdik /usr/bin/, aşağıdaki komutu kullanarak taşıyabiliriz :

sudo cp myShell /usr/bin/

Makinenin düzgün çalışabildiğinden emin olmak için makineyi yeniden başlatmamız gerekecek

kullandım sudo shutdown -r now

Tebrikler! Komutumuz şimdi bitti! Terminalde yazabiliriz myShellve şunu söylemeliyizHello World!


1
Kendi dosyalarınızı /usr/binkoymamalısınız - birçok sistem /usr/local/binbu amaç için çalışır ve /usr/binkesinlikle işletim sistemi için ayrılır.
tripleee

sudo chmodKendi dosyanıza gerek yok .
Üçlü

Makineyi yeniden başlatmanıza gerek yoktur. En fazla tekrar kaynak yapmalısınız
Luca Di Liello

14

Program için yürütülebilir biti etkinleştirmeniz gerekir.

chmod +x script.sh

Sonra kullanabilirsiniz ./script.sh

Klasörü .bashrcdosyanızdaki PATH öğesine (ana dizininizde bulunur) ekleyebilirsiniz . Bu satırı dosyanın sonuna ekleyin:

export PATH=$PATH:/your/folder/here

Zaten doğru izinleri ayarladığımı belirtmeyi unuttum. "Chmod 755 script.sh" komutunu kullandım
Rameez Hussain

6

Sudo install (komut dosyasının adı) / usr / local / bin / (söz konusu komut dosyasını yürütmek için yazmak istediğiniz şeyi yazabilirsiniz)

ör .: sudo install quickcommit.sh /usr/local/bin/quickcommit şifre girin

şimdi .sh olmadan ve herhangi bir dizinde çalışabilir


3

Ekle . (geçerli dizin) PATH değişkeninize ekleyin.
Bunu .profile dosyanızı düzenleyerek yapabilirsiniz.
Aşağıdaki satırı .profile dosyanıza koyun . Komut dosyanızın
PATH=$PATH:.

başına Shebang ( #!/bin/bash) satırını eklediğinizden ve komut dosyasını çalıştırılabilir (kullanarak chmod +x <File Name>) yaptığınızdan emin olun .


0

İşte size fikir ve otomasyon verecek yedekleme komut dosyası:

Sunucu: Ubuntu 16.04 PHP: 7.0 Apache2, Mysql vb ...

# Make Shell Backup Script - Bash Backup Script
    nano /home/user/bash/backupscript.sh
        #!/bin/bash
        # Backup All Start
        mkdir /home/user/backup/$(date +"%Y-%m-%d")
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_rest.zip /etc -x "*apache2*" -x "*php*" -x "*mysql*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_apache2.zip /etc/apache2
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_php.zip /etc/php
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_mysql.zip /etc/mysql
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_rest.zip /var/www -x "*html*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_html.zip /var/www/html
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/home_user.zip /home/user -x "*backup*"
        # Backup All End
        echo "Backup Completed Successfully!"
        echo "Location: /home/user/backup/$(date +"%Y-%m-%d")"

    chmod +x /home/user/bash/backupscript.sh
    sudo ln -s /home/user/bash/backupscript.sh /usr/bin/backupscript

/ home / user komutunu kullanıcı dizininize değiştirin ve komut dosyasını çalıştırmak için terminaldeki herhangi bir yere backupscript yazın ! (/ usr / bin komutunun yolunuzda olduğunu varsayarsak)


0

Koddan "#!/bin/sh"önce girin . Sonra script.shörneğin kaydedin . kopyalamak $HOME/bin veya $HOME/usr/bin
dizin farklı Linux dağıtımları üzerinde farklı olabilir ama onlar ile sona 'bin' ve ev dizinde bulunan cd $HOME/bin veya $HOME/usr/bin
Tip chmod 700 script.sh
Ve sadece yazarak çalıştırabilirsiniz run.sh terminali üzerinde. Çalışmazsa, chmod +x run.sh yerine deneyin chmod 700 run.sh


Bu cevabın mevcut çok eski cevaplardan bilgiyi yeniden ifade etmeyen kısımları karışıktır.
Üçlü

0

Herhangi bir dosyayı yürütülebilir olarak yap


Diyelim migrate_linux_amd64 adlı yürütülebilir bir dosyanız var ve bu dosyayı "migrate" gibi bir komut olarak çalıştırmak istiyorsunuz

  1. İlk olarak yürütülebilir dosyayı dosya konumundan test edin:
[oracle@localhost]$ ./migrate.linux-amd64 
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version
  1. Dosyada yürütme ayrıcalıklarına sahip olduğunuzdan emin olun
    -rwxr-xr-x 1 oracle oinstall 7473971 May 18 2017 migrate.linux-amd64
    , çalıştırınchmod +x migrate.linux-amd64

  2. Sonra sizin dosyayı kopyalamak /usr/local/bin. Bu dizinin kökü aittir, sudo kullanın veya köke geçin ve aşağıdaki işlemi gerçekleştirin

sudo cp migrate.linux-amd64 /usr/local/bin
sudo chown oracle:oracle /user/local/bin/migrate.linux.amd64
  1. Sonra aşağıdaki gibi sembolik bir bağlantı oluşturun
sudo ln /usr/local/bin/migrate.linux.amd64 /usr/local/bin/migrate
sudo chown oracle:oracle /usr/local/bin/migrate
  1. Son olarak yolunuza veya kullanıcı profilinize / usr / local / bin ekleyin
export PATH = $PATH:/usr/local/bin
  1. Ardından komutu "migrate" olarak çalıştırın
[oracle@localhost]$ migrate
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version

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.