2017-08-18 81 views
5

source ve .'un aynı şeyi yaptıklarını biliyorum ve başlıktaki diğer komut çiftlerinin aynı şeyi yapıp yapmadığını öğrenmeye şaşırdım (çünkü kabuğum gibi bash çalıştırıyorum, $SHELL [script] ve bash [script] eşdeğer, doğru mu?).

Komut dosyası yürütme üç yöntemi arasındaki fark nedir? Soruyorum çünkü yeni bir betiğin kaynaklanmasının, onu yürütmek için NOT the exact same olduğunu öğrendim. "Deneylerimi" yürütmekten ve adam sayfalarını okumaktan apaçık görmediğim bir şekilde.

Bu işlevleri, yazdığım inanılmaz derecede basit komut dosyalarına körü körüne çağırarak bulamadığım diğer ince farklılıklar nelerdir? Yukarıdaki bağlantılı cevabı okuduktan sonra, sorumun cevabının oldukça basit bir açıklama olacağını, ancak neredeyse hiç bir zaman tam olarak keşfedemeyeceğimi tahmin edebilirim.

İşte benim yaptığım "deney" var:

$. myScript.sh 
    "This is the output to my script. I'd like to think it's original." 

$source myScript.sh 
    "This is the output to my script. I'd like to think it's original." 

$bash myScript.sh 
    "This is the output to my script. I'd like to think it's original." 

$$SHELL myScript.sh 
    "This is the output to my script. I'd like to think it's original." 

$./myScript.sh 
    "This is the output to my script. I'd like to think it's original." 

$myScript.sh 
    "This is the output to my script. I'd like to think it's original." 

cevap

10

. script ve source script bir altkabuk yaratmadan mevcut ortamda, yani içinde scriptiçeriğini yürütmek. Bu, script'un mevcut ortamı etkilemesine izin verir, örneğin ortam değişkenlerini değiştirmek veya mevcut çalışma dizinini değiştirmek gibi. Aşağı yönde bu, script'un olası bir güvenlik tehlikesi olan mevcut ortamı etkilemesine izin verir.

bash script yürütmek bash tercümana script geçer. Shebang script tarafından verilen her şey göz ardı edilir. ("Shebang" kullanılacak tercüman belirtmek için #!/bin/bash veya #!/usr/bin/perl veya #!/usr/bin/awk, okumak mesela olabilir script ilk satırı, atıfta.)

$SHELL script için geçerli kabuk tercüman ne olursa olsun scriptgeçer yürütün. Bu, bash olabilir veya olmayabilir. (Ortam değişkeni SHELL mevcut kabuk tercüman adını almıştır. $SHELL, kabuğu çalıştıran, önceki paragrafta açıklanan etkisiyle, /bin/bash için değerlendirilir eğer.)

./script bir dosyanın içeriğini de scriptçalıştırır güncel çalışma dizini. Böyle bir dosya yoksa, bir hata oluşturulur. $PATH'un içeriği, ne olduğu konusunda hiçbir etkisi yoktur.

script bir dosya veya mevcut çalışma dizini dahil olabilir veya olmayabilir $PATH listelenen dizinleri, içinde scriptarar. Mevcut iş rehberinizde bulunan veya bulunmayan bu dizin listesinde bulunan ilk script çalıştırılır.

+0

Ahh, teşekkürler! Bu yüzden farklı bir kabuk (dş, csh) ve STILL [bash [script]] çağrısı yapıyor olabilirim. Shebang hakkında eklenen bölüm ilginçti! Yani "$ SHELL [script]" de shebangs göz ardı edecek. Daha önce farkettiğim bir başka şey de, deneylerimi yürütürken girdiğim dizinin $ PATH değişkenimde olmasıydı. Eğer olmasaydı, "[script]" sadece işe yaramazdı. Vay.Benzer benzer bir çıktı için bir ton fark var. –

+1

@AriSweedler: Bu doğru. Bazı araçların * geçerli kabuğunuzu * göz ardı ettiğini ve * açıkça * aksi belirtilmedikçe (örneğin crontab ve make) varsayılan olarak '/ bin/sh' için varsayılan değer olduğunu unutmayın. – DevSolar

+1

Açıklamalar: kaynak "Bashism", "." POSIX; '$ SHELL', kabuğunuzdan başka bir şeye genişleyebilir (örneğin, tire çalıştırırken '/ bin/bash' gibi). –