The . executable
sintaks tidak bekerja dengan sembarang executable (atau bukan?). Alih-alih, ini adalah alias untuk bash bawaan source
. Jadi perbedaannya sebagian besar relevan dengan skrip bash, dan kebenarannya adalah semuanya benar-benar berbeda :)
./executable
meminta untuk menjalankan executable "normal". ./
adalah referensi relatif ke jalur saat ini. Ini menghindari memiliki shell (bash) mencoba untuk menemukan executable di direktori di $PATH
(yang akan dilakukan jika Anda tidak menentukan path sama sekali dengan perintah). Alasan mengapa Anda tidak bisa begitu saja melakukannya executable
adalah karena alasan keamanan; bayangkan Anda membuka kompres arsip yang Anda unduh dan berisi versi jahat ls
. Jika dijalankan langsung dari direktori Anda saat ini, Anda akan menjalankan versi itu tanpa disadari.
Di sisi lain, . executable
mengatakan "sumber file bernama executable
". Karena Anda secara langsung memberi nama file dan itu benar-benar tidak harus dapat dieksekusi, pembatasan keamanan untuk $ PATH tidak berlaku. Sumber hanya akan "menjalankan" (atau tampaknya menjalankan) skrip shell. Apa yang dilakukannya adalah:
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.
Jadi ... Apa sebenarnya perbedaan antara mengeksekusi dan sumber? Dengan asumsi skrip shell yang sama, mengeksekusinya ( ./script
) akan menelurkan shell baru, menjalankan skrip di dalam shell itu, dan ketika skrip keluar, tutup shell itu dan kembali ke shell induk. Akibatnya, ini akan memulai bash
proses baru untuk menjalankan skrip).
( . script
) akan menyebabkan shell saat ini membaca perintah dari file seolah-olah sedang diketik di baris perintah. Tidak ada shell baru yang muncul.
Cara yang sangat mudah untuk melihat bagaimana ini berperilaku adalah dengan menulis skrip yang hanya berisi exit
. Jika ./script
ya, sepertinya tidak akan terjadi apa-apa, ini karena proses shell baru dimulai, exit
perintah keluar dari shell baru dan shell Anda saat ini tidak terpengaruh.
Jika Anda . script
, terminal Anda saat ini akan ditutup, karena exit
perintah berjalan di shell saat ini. Jadi itu sama dengan mengetik exit
pada command prompt.