Yanıtlar:
Özel komut dosyanız için ./script.sh
, yürütme ve okunabilir bitler gerektirmesi dışında , bash script.sh
yalnızca okunabilir bit gerektirmesi dışında her iki yol da çalışır .
İzin gereksinimi farkının nedeni, betiğinizi yorumlayan programın nasıl yüklendiğine bağlıdır:
./script.sh
kabuğunuzun dosyayı normal bir çalıştırılabilirmiş gibi çalıştırmasını sağlar.Kabuk kendisini çatallar ve execve
işletim sisteminin çatallanmış işlemdeki dosyayı çalıştırmasını sağlamak için bir sistem çağrısı (örn. ) Kullanır . İşletim sistemi, dosyanın izinlerini kontrol eder (bu nedenle, yürütme bitinin ayarlanması gerekir) ve isteği , dosyayı inceleyen ve nasıl yürütüleceğini belirleyen program yükleyiciye iletir . Linux'ta derlenen çalıştırılabilir kodlar bir ELF sihir numarası ile başlarken, scriptler bir #!
( hashbang ) ile başlar. Bir hashbang üstbilgisi, dosyanın bir komut dosyası olduğu ve hashbang'dan sonra belirtilen program tarafından yorumlanması gerektiği anlamına gelir. Bu, komut dosyasının kendisinin sisteme komut dosyasını nasıl yorumlayacağını söylemesini sağlar.
Komut dosyanızla birlikte, program yükleyici komut satırı argümanı olarak yürütülür /bin/bash
ve ./script.sh
iletilir.
bash script.sh
kabuğunuzun çalışmasını bash
ve script.sh
komut satırı argümanı olarak geçmesini sağlarBöylece işletim sistemi yüklenecek bash
(bakmadan bile script.sh
, çünkü sadece bir komut satırı argümanı). Oluşturulan bash
işlem daha sonra script.sh
komut satırı argümanı olarak iletildiği için yorumlayacaktır . Çünkü script.sh
sadece tarafından okunan bash
düzenli bir dosya olarak, yürütme biti gerekli değildir.
./script.sh
Yine de kullanmanızı öneririm , çünkü komut dosyasının hangi tercümanı gerektirdiğini bilmiyor olabilirsiniz. Öyleyse program yükleyici sizin için bunu belirlesin.
. ./script.sh
aynı şey değildir bash script.sh
(veya ./script.sh
. #!/usr/bin/python -V
<newline> betiğini düşünün print test
.
. script.sh
. Ancak, .
bu şekilde çağrılması amaçlanmayan senaryolar komutunu kullanmaktan vazgeçen insanlarla aynı fikirdeyim . Senaryo exit
komutlar içeriyorsa ve siz onu kaynaklıyorsanız, oturumunuzu kapattığını kimse söylememişse şaşırdım . Senaryo a yaparsa, daha az bir sıkıntı problemi de olur cd
, çünkü ana (etkileşimli) kabuğu da etkiler.
bash script.sh
betiği doğrudan bash kullanarak çağırır.
./script.sh
shebang'ı #!/bin/bash
nasıl çalıştırılacağını belirlemek için kullanıyor .
Gerçekten bilmek istersen, hangisini çalıştırırsan yapsan bash script.sh
öğrenebilirsin which bash
.
Yani örneğinizde hiç farketmez. Evet, chmod +x script.sh
direkt olarak gerçekleştirebilmelisiniz ./script.sh
.
/bin/bash
ilk olduğunu varsaymak farketmez . bash
$PATH
#!/bin/bash
/bin/bash
./script.sh
.
Bir dosya oluşturun Delete_Self.sh böyle:
#!/bin/rm
echo I am still here!
sh Delete_Self.sh
Gördüğünüz gibi bu betiği çalıştırın "Hala buradayım!" geri yankılandı.
Çalıştırılabilir hale getirin ./Delete_Self.sh
ve dosyanın Delete_Self.sh
kendisi gittiğinde hiçbir şeyin geri çevrilmediğini göreceğiniz gibi çalıştırın .
Yani fark şu ki:
bash script.sh
# görmezden gelecek! çünkü bash, script.sh komutunu çalıştıracak program olarak belirtilir../script.sh
# okuyacak! Çalıştırılacak programı belirlemek için satır script.sh
.Diğer cevaplara ek olarak, bir komut dosyasını ./script.sh
(i) ile kaynak ./script.sh
(ii) üzerinden çalıştırmak arasındaki farkı bilmek faydalıdır - (i) sürümü, komutun çalıştırılacağı yeni bir kabuk oluşturur, oysa (ii) komutun içinde Geçerli kabuk - yürütülebilir dosya çalıştırıldıktan sonra korunması gereken ortam değişkenlerini değiştirirse zorunlu olabilir. Örneğin, bir python conda ortamını etkinleştirmek için aşağıdakiler kullanılmalıdır:
source activate my_env
NB başka alternatif source
karşılaşabileceğiniz olmasıdır .
yerleşik, yani
. activate my_env