. executableSözdizimi sadece herhangi çalıştırılabilir ile çalışmak (veya bunu yapar?) Gelmez. Bunun yerine, bu sourceyerleşik bash için bir takma addır . Bu yüzden fark çoğunlukla bash betikleriyle ilgilidir ve gerçek şu ki tamamen farklı şeylerdir :)
./executableyürütülebilir dosyayı "normalde" çalıştırmayı ister. ./, geçerli yola ilişkin göreli bir başvurudur. Bu, shell'in (bash) çalıştırılabilirini kendi dizinindeki bir dizinde bulmaya çalışmasını önler ( $PATHkomutla hiç bir yol belirtmezseniz bunu yapar). Sadece yapamamanızın nedeni executablebir güvenlik; indirdiğiniz bir arşivi açtığınızı ve bu dosyanın kötü amaçlı bir sürümünü içerdiğini hayal edin ls. Doğrudan geçerli dizininizden yayınlandıysa, farkında olmadan o sürümü çalıştırırsınız.
Öte yandan, . executable"kaynak bir dosya kaynak executable" diyor. Dosyayı doğrudan adlandırdığınızdan ve gerçekten yürütülebilir bir dosya olması gerekmediğinden, $ PATH için güvenlik kısıtlaması geçerli değildir. Kaynak kullanımı yalnızca kabuk komut dosyalarını "çalıştırır" (veya çalıştırıyor gibi görünür). Yaptığı şey:
source filename [arguments]
Read and execute commands from filename in the current shell
environment and return the exit status of the last command exe‐
cuted from filename.
Peki ... Gerçekte yürütme ve kaynak sağlama arasındaki fark nedir? Aynı kabuk betiğini varsayarsak, ( ./script) yürütmek yeni bir kabuk oluşturacak, betiği o kabuğun içinde çalıştıracak ve betiği çıkınca o kabuğu kapatacak ve üst kabuğa dönecektir. Aslında bash, komut dosyasını yürütmek için yeni bir işlem başlatacaktır ).
( . script) geçerli kabuğun komut satırında yazılıyormuş gibi komutları dosyadan okumasına neden olur . Yeni bir kabuk ortaya çıkmadı.
Bunun nasıl davrandığını görmenin çok kolay bir yolu, yalnızca içeren bir komut dosyası yazmaktır exit. Bunu yaparsanız ./script, hiçbir şey olmayacak gibi görünüyor, bunun nedeni yeni bir kabuk işleminin başlatılması, exitkomutun yeni kabuktan çıkması ve geçerli kabuğunuzun etkilenmemesidir.
Eğer varsa . script, geçerli terminali kapanacak, çünkü exitşimdiki kabuğunda komut çalışır. Bu exit, komut isteminde yazmakla eşdeğerdir .