Yanıtlar:
Eğer kullanırsan
sh ./<script>.run
/bin/sh
(genellikle bir Bourne kabuğu) komut dosyasını çalıştırmak için kullanılır. Tabii ki bu sadece senaryo Bourne kabuğu için yazılmışsa işe yarar. Bazen Linux için kabuk komut dosyaları Bourne kabuğu yerine Bash gerektirir, bu nedenle bir kabuk komut dosyası olsa bile bu çalışmayabilir.
Eğer kullanırsan
./<script>.run
çekirdek programı çalıştırmak için hangi programı kullanacağını bulmak için shebang hattına bakar . Bu Bash, Perl, Python veya başka bir senaryo olsa bile çalışır.
Bu nedenle, genellikle bir komut dosyası çalıştırmanın tercih edilen yolu budur.
sh
(Dash veya eşdeğeri) bir kabuk komut dosyası olduğu sürece , hayır, dışa doğru bir fark yoktur.
Sorun, bunun .run
böyle olduğunu garanti etmez. İkili olabilir. Bash veya Python veya PHP ya da her neyse olabilir; hepsinin bir kabuk komut dosyası hash-bang var. Eğer körü körüne zorlarsanız sh
, neler olabileceğini kim bilir. Muhtemelen hata yapacaktır, ancak bu kadar ilerlemeden önce yanlışlıkla zararlı kod çalıştırabilir.
Bunu chmod
kullanarak (yürütme izin bitini etkinleştirmek için) ve sonra çalıştırarak ./script.run
, mümkün olan en iyi çalıştırma olasılığını verirsiniz. Bir kabuk komut dosyasıysa, hash-bang düzgün ayrıştırılır ve ikili çalıştırılabilirse, yerel olarak çalışır.
İki yöntem genellikle aynı şekilde davranabilir, ancak çok farklıdır.
sh ./script
çalışan sh
bir argümanla komutu ./script
komut aslında olmasa bile .. verilen senaryoyu yürütmek için olur, sh
komut dosyası (kötü)
./script
verilen dosyayı yürütür. Bunu hangi komutun çalıştırılacağını belirlemek için "shebang" satırını arayarak yapar . Belirtilmezse kullanır sh
(bu iki yöntem bazen aynı davranır), ancak genellikle farklı bir tercüman belirtilir.
Örneğin filename
, aşağıdakileri içeriyorsa:
#!/usr/bin/python
print "This is a Python script!"
..onki iki komut çok farklı:
$ sh script
script: line 3: print: command not found
$ chmod +x script
$ ./script
This is a Python script!
Eğer bir shebang hattı yoksa, ikisi aynıdır:
$ cat script
echo "This is an sh script"
$ sh ./script
This is an sh script
$ ./script
This is an sh script
Önemli bir fark, hashbang hattınızın parametreleri olup olmamasıdır. Örneğin, komut dosyası ile başlıyorsa
#!/bin/bash -e
... ve harici olarak sh
veya komutunu kullanarak çalıştırırsanız bash
, bu satır yorum olarak yorumlanır ve yoksayılır, böylece -e
parametre (hata durumunda çıkış) işlenmez. Yani, aşağıdaki komut dosyası verildiğinde:
#!/bin/bash -e
echo Hello
false
echo goodbye
İçin çıktı ./script
sadece "Merhaba" olacak, ama için çıktı takip sh script
edecek , muhtemelen amaçlanmamıştır.Hello
goodbye
Bu arada, her zaman ayrı bir set -e
ifade kullanmalısınız (yine de iyi bir fikir - daha sık olmamakla birlikte, senaryo ortasında bir sorun varsa, göz ardı edilmesini istemezsiniz).