Saya punya satu sumber bash run.sh
sebagai berikut,
#!/bin/bash
if [ $# -ne 1 ]; then
exit
fi
...
ketika saya menjalankannya dengan dua cara, ada perilaku yang berbeda. Cara pertama adalah,
source run.sh
Ini akan menutup terminal setelah eksekusi. Cara kedua adalah,
./run.sh
ini hanya akan selesai menjalankan skrip, dan tetap di terminal. Saya bertanya apakah ada perintah untuk keluar dari skrip bash untuk keduanya source run.sh
dan ./run.sh
eksekusi. Saya telah mencoba return
juga, yang tidak berfungsi dengan baik dalam ./run.sh
eksekusi.
Secara umum, saya tertarik mengapa ini terjadi, dan apa perbedaan antara menggunakan "sumber" dan "." untuk eksekusi skrip?
$- = *i*
bekerja?-
memegang bendera opsi yang sedang aktif. Tes memeriksa apakah-i
bendera aktif. Lihat gnu.org/software/bash/manual/html_node/Special-Parameters.htmlPikirkan perintah 'sumber' seperti dalam pernyataan 'sertakan'. Dibutuhkan konten argumen dan menjalankannya seolah-olah itu dijalankan secara langsung. Dalam hal ini perintah Anda adalah 'sumber' dengan argumen 'run.sh' dan run.sh dijalankan persis seolah-olah Anda telah mengetik konten run.sh ke dalam baris perintah Anda.
Ketika Anda menjalankan './run.sh', './run.sh' adalah perintah Anda dan tidak memiliki argumen. Karena file ini teks biasa dan bukan biner, shell Anda mencari juru bahasa di shebang ('#!' Di baris pertama) dan menemukan '/ bin / bash'. Jadi shell Anda kemudian memulai instance baru bash dan konten run.sh dijalankan di dalam instance baru ini.
Pada contoh pertama, ketika bash mencapai perintah 'keluar' itu dijalankan persis seolah-olah Anda telah mengetiknya di baris perintah. Dalam contoh kedua ini dijalankan dalam proses bash, shell Anda mulai, jadi hanya instance bash ini yang menerima perintah 'keluar'.
Saat Anda mengetikkan baris ke bash, apa pun sebelum spasi pertama diperlakukan sebagai perintah dan apa pun yang berikut diperlakukan sebagai argumen. Perintah '.' adalah alias dari 'sumber'. Ketika Anda menjalankan '. run.sh 'the'. ' adalah perintah pada itu sendiri karena dipisahkan dari argumennya oleh spasi. Ketika Anda menjalankan './run.sh' perintah Anda adalah './run.sh' dan '.' adalah bagian dari jalur relatif untuk menjalankan.sh dengan '.' mewakili folder Anda saat ini.
sumber