Saya perlu klarifikasi mengenai cara kita menjalankan executable di bawah terminal. Ini mungkin pertanyaan yang lemah, tetapi apa perbedaan antara menjalankan executable dengan ./an_executable
dan . an_executable
(misalkan kita berada di dir di mana an_executable berada)
Saya sudah tahu bahwa yang pertama membuat shell mencari an_executable di direktori saat ini ( .
), tetapi mengapa tidak /
diperlukan setelah .
saat menggunakan versi yang terakhir?
Terima kasih sebelumnya.
command-line
executable
zipzap
sumber
sumber
Jawaban:
The
. executable
sintaks tidak bekerja dengan sembarang executable (atau bukan?). Alih-alih, ini adalah alias untuk bash bawaansource
. 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 melakukannyaexecutable
adalah karena alasan keamanan; bayangkan Anda membuka kompres arsip yang Anda unduh dan berisi versi jahatls
. Jika dijalankan langsung dari direktori Anda saat ini, Anda akan menjalankan versi itu tanpa disadari.Di sisi lain,
. executable
mengatakan "sumber file bernamaexecutable
". 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: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 memulaibash
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, karenaexit
perintah berjalan di shell saat ini. Jadi itu sama dengan mengetikexit
pada command prompt.sumber
ls
output: Anda mengetik perintah, itu berjalan, menunjukkan output dan kemudian berakhir, tetapi output tetap di terminal.bash
shell yang berjalan di dalamnya. Jika Anda mengetikbash
, Anda akan menjalankan shell lain ; ke shell pertama, itu hanya sebuah program yang akan dijalankan. Jika Anda mengetikexit
, Anda akan menutup shell terakhir yang Anda mulai tetapi masih di shell pertama (yang dari saat Anda memulai terminal). Sekali lagi, ini semua terjadi dalam terminal yang sama.