Apa perbedaan antara menjalankan skrip seperti ini:
./test.sh
dan menjalankan skrip seperti ini:
. test.sh
?
Saya mencoba skrip dua baris sederhana untuk melihat apakah saya dapat menemukan apakah ada perbedaan:
#!/bin/bash
ls
Tetapi keduanya . test.sh
dan ./test.sh
mengembalikan informasi yang sama.
test.sh
tidak sama dengan./test.sh
(yang pertama memanggilPATH
pencarian), begitu juga. test.sh
dan. ./test.sh
berbeda dengan cara yang sama (yang pertama memanggilPATH
pencarian). Banyak cangkang tampaknya secara implisit termasuk.
di akhirPATH
ketika melakukan.
pencarian jalur, tetapi perilaku ini tidak standar. Oleh karena itu, lebih akurat untuk membandingkantest.sh
vs. test.sh
dan./test.sh
vs. ./test.sh
.Jawaban:
./test.sh
berjalantest.sh
sebagai program terpisah. Mungkin terjadi skrip bash, jika filetest.sh
dimulai dengan#!/bin/bash
. Tapi itu bisa menjadi sesuatu yang lain sama sekali.. ./test.sh
mengeksekusi kode filetest.sh
di dalam instance bash yang sedang berjalan. Ini berfungsi seolah-olah file kontentest.sh
telah dimasukkan secara tekstual alih-alih. ./test.sh
baris. (Hampir: ada beberapa detail yang berbeda, seperti nilai$BASH_LINENO
, dan perilakureturn
builtin.)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 termasuk skrip dengan.
builtin adalah bahwa jikatest.sh
skrip mengatur beberapa variabel lingkungan, dengan proses terpisah, hanya lingkungan proses anak diatur, sedangkan dengan penyertaan skrip, lingkungan dari proses shell tunggal diatur. Jika Anda menambahkan barisfoo=bar
ditest.sh
danecho $foo
di akhir skrip panggilan, Anda akan melihat perbedaannya:sumber
echo $$
skrip juga akan menunjukkan perbedaan yang cukup jelas. The$$
variabel memegang PID dari shell saat ini.. ./test.sh
panggilan dari dalam skrip shell lain untuk menggunakan fungsi-fungsi yang dijelaskan dalam test.sh. Maksud saya, bukan hanya variabel yang dapat Anda atur, Anda juga dapat membuat fungsi baru dengan cara ini yang kemudian dapat dipanggil dari bash, atau beberapa skrip lainnya.. /usr/libexec/company/tools; custom_command "variable
"Menjalankan skrip dengan cara pertama menjalankannya sebagai proses anak. Sourcing (cara kedua), di sisi lain, menjalankan skrip seolah-olah Anda memasukkan semua perintahnya ke shell saat ini - jika skrip menetapkan variabel, itu akan tetap ditetapkan, jika skrip keluar, sesi Anda akan keluar. Lihat
help .
untuk dokumentasi.sumber
Hal lain yang saya perhatikan adalah jika Anda memiliki alias seperti ini:
Dengan
./test.sh
Anda akan mendapatkanls
output normal (dan PID berbeda dari shell saat ini):Dengan
. test.sh
atau. ./test.sh
Anda akan mendapatkan output yang lebih detail (dan PID yang sama dari shell saat ini):sumber
.bashrc
if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi
Lalu, masukkan alias Anda.bash_aliases
.alias
kata kunci? (Mungkin itu hanya kesalahan pada Anda setelah - di jalur 3?)Penggunaan utama bagi saya untuk
source
(atau.
) adalah fungsi bash .Saya memiliki skrip dengan banyak fungsi dan saya menjalankan semuanya dengan saya
.bashrc
. Fungsi "menjadi" perintah, yang sering saya gunakan.sumber