Apa perbedaan antara menjalankan skrip seperti ini:
./test.sh
dan jalankan skrip seperti ini:
. test.sh
?
Saya mencoba skrip dua baris sederhana untuk melihat apakah ada perbedaan:
#!/bin/bash
ls
Tapi keduanya . test.sh
dan ./test.sh
mengembalikan informasi yang sama.
Jawaban yang Diterima:
./test.sh
menjalankan test.sh
sebagai program tersendiri. Ini mungkin skrip bash, jika file test.sh
dimulai dengan #!/bin/bash
. Tapi itu bisa menjadi sesuatu yang lain sama sekali.
. ./test.sh
mengeksekusi kode file test.sh
di dalam instance bash yang sedang berjalan. Ini berfungsi seolah-olah file konten test.sh
telah dimasukkan secara tekstual alih-alih . ./test.sh
garis. (Hampir:ada beberapa detail yang berbeda, seperti nilai $BASH_LINENO
, dan perilaku return
bawaan.)
source ./test.sh
identik dengan . ./test.sh
di bash (di shell lain, source
mungkin sedikit berbeda atau tidak ada sama sekali; .
untuk dimasukkan dalam standar POSIX).
Perbedaan yang paling umum terlihat antara menjalankan skrip terpisah dengan ./test.sh
dan menyertakan skrip dengan .
bawaan adalah jika test.sh
skrip menetapkan beberapa variabel lingkungan, dengan proses terpisah, hanya lingkungan proses anak yang diatur, sedangkan dengan penyertaan skrip, lingkungan dari proses shell tunggal diatur. Jika Anda menambahkan baris foo=bar
di test.sh
dan echo $foo
di akhir skrip panggilan, Anda akan melihat perbedaannya:
$ cat test.sh
#!/bin/sh
foo=bar
$ ./test.sh
$ echo $foo
$ . ./test.sh
$ echo $foo
bar