Yanıtlar:
Yürütülemeyen bir sh
komut dosyasını çalıştırmak için şunu kullanın:
sh myscript
Yürütülemeyen bir bash
komut dosyasını çalıştırmak için şunu kullanın:
bash myscript
Bir yürütülebilir dosyayı başlatmak için (yürütülebilir izinli herhangi bir dosyadır); sadece yoluyla belirtirsiniz:
/foo/bar
/bin/bar
./bar
Bir komut dosyasını yürütülebilir yapmak için gerekli izni verin:
chmod +x bar
./bar
Bir dosya yürütülebilir olduğunda, çekirdek nasıl çalıştırılacağını bulmaktan sorumludur. İkili olmayan dosyalar için, bu dosyanın ilk satırına bakarak yapılır. Şunları içermelidir hashbang
:
#! /usr/bin/env bash
Hashbang çekirdeğe hangi programı çalıştırdığını söyler (bu durumda komut /usr/bin/env
argümanla çalıştırılır bash
). Ardından, komut dosyasına sonraki bağımsız değişkenler olarak verdiğiniz tüm bağımsız değişkenlerle birlikte programa (ikinci bağımsız değişken olarak) geçirilir.
Bu , yürütülebilir her komut dosyasının bir hashbang olması gerektiği anlamına gelir . Böyle olmazsa, sen ne çekirdek söylemediğin olduğunu ve bu nedenle çekirdek onu yorumlama kullanmak ne programı bilmiyor. Olabilir bash
, perl
, python
, sh
, başka bir şey. (Gerçekte, çekirdek dosyayı yorumlamak için genellikle kullanıcının varsayılan kabuğunu kullanır; bu çok tehlikelidir, çünkü doğru yorumlayıcı olmayabilir veya bir kısmını ayrıştırabilir, ancak olgu arasında sh
ve bash
).
/usr/bin/env
En yaygın olarak, karma patlamalarını şu şekilde görürsünüz:
#!/bin/bash
Sonuç olarak, çekirdek /bin/bash
komut dosyasını yorumlamak için programı çalıştıracaktır . Ne yazık ki, bash
her zaman varsayılan olarak gönderilmez ve her zaman mevcut değildir /bin
. Linux makinelerde genellikle, veya bash
gibi çeşitli konumlarda gemilerin bulunduğu bir dizi başka POSIX makinesi vardır ./usr/xpg/bin/bash
/usr/local/bin/bash
Taşınabilir bir bash betiği yazmak için, bash
programın yerini kodlamaya güvenemeyiz . POSIX zaten bununla başa çıkmak için bir mekanizmaya sahiptir: PATH
. Buradaki fikir, programlarınızı içinde bulunduğunuz dizinlerden birine kurmanız PATH
ve sistemin programınızı ismiyle çalıştırmak istediğinizde bulabilmesidir.
Ne yazık ki, sen olamaz sadece bunu:
#!bash
Çekirdek (bazıları PATH
sizin için ) arama yapmaz . Buna PATH
rağmen sizin için arama yapabilen bir program var env
. Neyse ki, neredeyse tüm sistemlerde env
yüklü bir program var /usr/bin
. Bu yüzden, kodunuzu yorumlayabilmesi için env
bir PATH
arama yapan bash
ve çalıştıran sabit kodlu bir yol kullanmaya başlarız :
#!/usr/bin/env bash
Bu yaklaşımın bir dezavantajı vardır: POSIX'e göre, hashbang'ın bir argümanı olabilir . Bu durumda, programın bash
argümanı olarak kullanırız env
. Bu, argümanları iletmek için boş alanımız olmadığı anlamına gelir bash
. Dolayısıyla #!/bin/bash -exu
, bu şemaya benzer bir şeyi dönüştürmenin yolu yoktur . Bunun set -exu
yerine hashbang'ın arkasına koymalısın.
Bu yaklaşımın başka bir avantajı daha vardır: Bazı sistemler bir ile birlikte gelebilir /bin/bash
, ancak kullanıcı bundan hoşlanmayabilir, buggy veya modası geçmiş bulabilir ve bash
başka bir yere kendi yüklemiş olabilir . Bu genellikle Apple'ın modası geçmiş /bin/bash
bir ürünü gönderdiği ve kullanıcıların /usr/local/bin/bash
Homebrew gibi bir şey kullanarak güncel bir kurulum yükledikleri OS X (Mac'ler) için geçerlidir . Arama yapan env
yaklaşımı kullandığınızda, PATH
kullanıcının tercihini hesaba katar ve sistemiyle birlikte gelen tercihini kullanır.
zsh
benim kabuk olarak, ben kullanırım hashbang
#! /usr/bin/env zsh
?
#! /usr/bin/env zsh
kod Z kabuğu tarafından yürütülecekse (ve yalnızca) kullanmalısınız .
Bourne kabuğu için:
sh myscript.sh
Bash için:
bash myscript.sh
Komut dosyasının geçerli kabukta çalışmasını istiyorsanız (örneğin, dizininizi veya ortamınızı etkileyebilmesini istiyorsanız) şunları söylemelisiniz:
. /path/to/script.sh
veya
source /path/to/script.sh
Not /path/to/script.sh
Örneğin, değişken olmasına . bin/script.sh
çalışır script.sh
içinde bin
geçerli dizinin altındaki dizinde.
İlk olarak, icra izni verin: -
chmod +x script_name
sh script_name
bash script_name
./script_name
NOT : - dosyanın 'ls -a' kullanarak yürütülebilir olup olmadığını kontrol edebilirsiniz
Biraz ekleme, aynı klasörden bir tercüman çalıştırmak için, hala komut dosyalarında #! Hashbang kullanıyor .
Örneğin , / usr / bin dizininden kopyalanan php7.2 yürütülebilir dosyası, bir merhaba komut dosyası boyunca bir klasörde bulunur .
#!./php7.2
<?php
echo "Hello!";
Çalıştırmak için:
./hello
Hangisi gibi davranır:
./php7.2 hello