. executable
Sözdizimi sadece herhangi çalıştırılabilir ile çalışmak (veya bunu yapar?) Gelmez. Bunun yerine, bu source
yerleş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 :)
./executable
yü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 ( $PATH
komutla hiç bir yol belirtmezseniz bunu yapar). Sadece yapamamanızın nedeni executable
bir 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ı, exit
komutun 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 .