+ X ve ./ <script> ve sh ./ <script> arasındaki fark


13

Bir komut dosyasını çalıştırmak arasında gerçek farklar var mı

[sudo] sh ./<script>.run

onun yerine

[sudo] chmod +x ./<script>.run
[sudo] ./<script>.run

Yanıtlar:


18

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.


1
Olis cevap dediğim gibi: Ben onun büyük olasılıkla iyi, hasta beklemek ve kimse başka bir bilgi olup olmadığını görmek ve daha sonra bir cevap kabul görmek - / / / sh / shebang çalıştırın yürütülebilir kontrol kontrol
user36976

7

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 .runbö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 chmodkullanarak (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.


Ah cevap için teşekkürler bilmiyordum, sadece hash-bang çalıştırmak çalıştırılabilir kontrol / bin / sh olduğunu, bu yüzden onun iyi olduğunu düşünüyorum
user36976

1

İki yöntem genellikle aynı şekilde davranabilir, ancak çok farklıdır.

sh ./scriptçalışan shbir argümanla komutu ./scriptkomut aslında olmasa bile .. verilen senaryoyu yürütmek için olur, shkomut dosyası (kötü)

./scriptverilen 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

1

Ö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 shveya komutunu kullanarak çalıştırırsanız bash, bu satır yorum olarak yorumlanır ve yoksayılır, böylece -eparametre (hata durumunda çıkış) işlenmez. Yani, aşağıdaki komut dosyası verildiğinde:

#!/bin/bash -e
echo Hello
false
echo goodbye

İçin çıktı ./scriptsadece "Merhaba" olacak, ama için çıktı takip sh scriptedecek , muhtemelen amaçlanmamıştır.Hellogoodbye

Bu arada, her zaman ayrı bir set -eifade 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).


0

Hayır

[sudo] chmod +x ./<scrupt>.runkomut dosyasını çalıştırılabilir hale getirir, böylece çalıştırabilirsiniz ./<script>.run.
İle [sudo] sh ./<script>.runçalıştırılabilir olmasa bile, çalıştırabilirsiniz.

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.