Jawaban:
Untuk skrip spesifik Anda, cara apa pun akan berfungsi, kecuali yang ./script.sh
membutuhkan eksekusi dan bit yang dapat dibaca, sementara bash script.sh
hanya membutuhkan bit yang dapat dibaca.
Alasan perbedaan persyaratan izin terletak pada bagaimana program yang menginterpretasikan skrip Anda dimuat:
./script.sh
membuat shell Anda menjalankan file seolah-olah itu adalah executable biasa.Shell execve
bercabang sendiri dan menggunakan panggilan sistem (mis. ) Untuk membuat sistem operasi menjalankan file dalam proses bercabang. Sistem operasi akan memeriksa izin file (maka bit eksekusi perlu diatur) dan meneruskan permintaan ke program loader , yang melihat file dan menentukan bagaimana cara mengeksekusinya. Di Linux yang dapat dikompilasi executable mulai dengan angka ajaib ELF , sedangkan skrip mulai dengan #!
( hashbang ). Header hashbang berarti bahwa file tersebut adalah skrip dan perlu ditafsirkan oleh program yang ditentukan setelah hashbang. Ini memungkinkan skrip itu sendiri untuk memberi tahu sistem cara menafsirkan skrip.
Dengan skrip Anda, program loader akan mengeksekusi /bin/bash
dan lulus ./script.sh
sebagai argumen baris perintah.
bash script.sh
menjadikan shell Anda berjalan bash
dan lulus script.sh
sebagai argumen baris perintahJadi sistem operasi akan memuat bash
(bahkan tidak melihat script.sh
, karena itu hanya argumen baris perintah). Proses yang dibuat bash
kemudian akan menafsirkan script.sh
karena dilewatkan sebagai argumen baris perintah. Karena script.sh
hanya dibaca bash
sebagai file biasa, bit eksekusi tidak diperlukan.
Saya sarankan menggunakan ./script.sh
, karena Anda mungkin tidak tahu juru bahasa mana yang membutuhkan skrip. Jadi biarkan program loader menentukannya untuk Anda.
. ./script.sh
bukan hal yang sama dengan bash script.sh
(atau ./script.sh
. Pertimbangkan skrip #!/usr/bin/python -V
<newline> print test
.
. script.sh
. Tapi saya setuju dengan orang-orang yang tidak suka menggunakan .
perintah pada skrip yang tidak dimaksudkan seperti itu. Saya terkejut bahwa tidak ada yang menyebutkan bahwa, jika skrip berisi exit
perintah, dan Anda sumbernya, itu bisa mengeluarkan Anda. Masalah yang kurang mengerikan adalah jika skrip melakukan cd
, karena itu juga akan mempengaruhi shell induk (interaktif).
bash script.sh
meminta skrip secara langsung menggunakan bash.
./script.sh
menggunakan shebang #!/bin/bash
untuk menentukan bagaimana mengeksekusi.
Jika Anda benar-benar ingin tahu, biner mana yang dijalankan jika Anda melakukannya, bash script.sh
Anda bisa mengetahuinya which bash
.
Jadi, dalam contoh Anda itu tidak ada bedanya. Ya, Anda harus chmod +x script.sh
dapat menjalankannya langsung melalui ./script.sh
.
/bin/bash
adalah yang pertama bash
di Anda $PATH
.
#!/bin/bash
hanya berfungsi jika ada/bin/bash
./script.sh
.
Buat file Delete_Self.sh seperti ini:
#!/bin/rm
echo I am still here!
Jalankan skrip ini karena sh Delete_Self.sh
Anda akan melihat "Saya masih di sini!" bergema kembali.
Jadikan itu dapat dieksekusi, dan jalankan karena ./Delete_Self.sh
Anda akan melihat tidak ada yang digaungkan kembali, sementara file Delete_Self.sh
itu sendiri hilang.
Jadi perbedaannya adalah:
bash script.sh
akan mengabaikan #! baris, karena bash ditentukan sebagai program untuk menjalankan script.sh../script.sh
akan membaca #! baris untuk menentukan program yang akan dijalankan script.sh
.Selain jawaban lain, mengetahui perbedaan antara menjalankan skrip melalui ./script.sh
(i) dan sumber ./script.sh
(ii) berguna - Versi (i) membuat shell baru untuk menjalankan perintah, sedangkan (ii) menjalankannya di shell saat ini - yang dapat diwajibkan jika executable mengubah variabel lingkungan yang perlu dipertahankan setelah keluar executable. Misalnya, untuk mengaktifkan lingkungan python conda, berikut ini harus digunakan:
source activate my_env
NB Alternatif lain source
yang mungkin Anda temui adalah .
builtin, yaitu
. activate my_env