Yanıtlar:
Bu bağlamdaki bir nokta, bu dosyanın içeriğini geçerli kabuğa "kaynaklamak" anlamına gelir. İle source
kendisi bir kabuk yerleşik komutu olma. Ve source
nokta operatörü eşanlamlılar.
Bir sample.sh
dosyada aşağıdaki içerikleri bulunduğunu söyleyin .
$ cat sample.sh
echo "hi"
echo "bye?"
Şimdi kaynak yaptığımda:
$ . sample.sh
hi
bye?
$
Bunun gibi dosyalar genellikle çevre değişkenlerine bir şeyler eklemek gibi kurulum komutlarını dahil etmek için kullanılır.
Diyelim ki bu komutları başka bir dosyada addvars.sh
.
$ cat addvars.sh
export VAR1="some var1 string"
export VAR2="some var2 string"
Şu anki kabuğumun ortamında hiçbir değişken olmadığına dikkat edin.
$ env | grep VAR
$
Şimdi bu dosyaya kaynak yaptığımda:
$ . addvars.sh
$
Tamam, bir şey yapmış gibi görünmüyor, ancak env
değişkenleri tekrar kontrol ettiğimizde :
$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string
Slm'nin cevabına eklemek için:
Bir kabuk betiğini çalıştırmanın iki yolu vardır. Bunlardan biri betiği ayrı bir işlemde çalıştırmaktır; bu, kabuğun ortamı (bellek durumu) ile ilgili herhangi bir şeyin, "alt" kabuk işlemini çalıştırmadan önce "üst" kabuğun durumuna döneceği anlamına gelir.
Örneğin, geçerli çalışma dizini (bir dosya sistemindeki konum) işlem başına belirlenir. Öyleyse şuna benzeyen bir senaryo yazalım:
#!/bin/bash
cd ~
cd ..
pwd
Öyleyse bu senaryoyu diyelim, oh foo
. Ve şu komut dosyasını şu şekilde çalıştıralım:./foo
Aşağıdakileri göreceğiz:
/home
(Bazılarının kullanıcı dizinlerini koymadığı çok sayıda Linux ve diğer UNIX klonu dağıtımının standart olarak reddedilmesi /home
. Veya "Sizin kilometreniz değişebilir" dediğimiz gibi)
Şimdi, bu betiği çalıştırdıktan sonra, bu komutu yazalım
pwd
Hangi dizinde olduğumuzu görmek için. Bunun gibi bir şey göreceğiz:
/home/username
Sebebi, yine koştuğumuz kabuk betiğinin kendi ortamı vardı (komutların çalıştığı kendi dizini de dahil) ve betiğin çalışması bittiğinde o ortam kayboldu.
Şimdi, foo
betiği bu şekilde çalıştıralım
. ./foo
Veya eşdeğer olarak:
source ./foo
Daha pwd
sonra yaparsak, şunu göreceğiz:
/home
Sebebi: Bir betiği kaynaklamak ayrı bir süreç değil. Ana işlemdeki tüm komutları elle yazmak gibi bir şeydir; komut dosyası bittikten sonra ortamı korunur.
Daha basit bir örnek bulmama izin verin. Şuna benzeyen bir senaryo yazalım:
#!/bin/bash
exit
Adını verelim foo
. En bunu çalıştırabilirsiniz emin olalım: chmod 755 foo
. O zaman, hadi şöyle koşalım:
./foo
Hiçbir şey olmuyor. Ancak, eğer bunu yaparsak:
. ./foo
Veya bu:
source ./foo
Çıkış yapıyoruz.
# type .
. is a shell builtin
# help .
.: . filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
. (kaynak veya nokta operatörü)
Geçerli kabuk bağlamında dosya adı bağımsız değişkenindeki komutları okuyun ve uygulayın.
Syntax
. filename [arguments]
source filename [arguments]
source, nokta / nokta 'ile eşanlamlıdır.' bash, ancak POSIX sh’de değil, bu nedenle maksimum uyumluluk için dönemi kullanın.
Bir komut dosyası, kaynak kullanılarak çalıştırıldığında, mevcut kabuk içinde çalışır, komut dosyası tarafından oluşturulan veya değiştirilen değişkenler, komut dosyası tamamlandıktan sonra kullanılabilir durumda kalır. Bunun aksine, komut dosyası bir dosya adı gibi çalıştırılırsa, komut dosyasını çalıştırmak için ayrı bir alt kabuk (tamamen ayrı bir değişkenler kümesiyle) oluşturulur.
Bir betiği çalıştırmak için, .ss64script (dot ss64script) ve. ss64script (nokta boşluğu ss64script)
ilki 'ls' komutundan gizlenmiş bir dosyayı çalıştırıyor, (ls -a gizli dosyaları gösterse de) ikinci seçenek chmod ile çalıştırılabilir olarak ayarlanmamış olsa bile ss64script'i çalıştırıyor.
TL; DR
Nokta, kaynak komutuyla aynıdır.
kaynak, geçerli bağlamda yürütülen bir komut listesi olarak komutu izleyen dosyayı değerlendiren bir Unix komutudur.