Apakah ada perbedaan aktual antara menjalankan skrip dengan
[sudo] sh ./<script>.run
dari pada
[sudo] chmod +x ./<script>.run
[sudo] ./<script>.run
command-line
chmod
pengguna36976
sumber
sumber
Selama
sh
skrip shell (Dash, atau yang setara), tidak, tidak ada perbedaan luar.Masalahnya adalah
.run
tidak menjamin itu masalahnya. Bisa jadi biner. Itu bisa Bash atau Python atau PHP atau apa pun; mereka semua memiliki shell script hash-bang. Jika Anda membabi buta memaksanyash
, siapa yang tahu apa yang bisa terjadi. Ini mungkin akan error-out tetapi secara tidak sengaja dapat menjalankan kode berbahaya sebelum sampai sejauh itu.Dengan
chmod
mematikannya (untuk mengaktifkan bit izin eksekusi) dan kemudian menjalankannya./script.run
, Anda memberikan kemungkinan terbaik untuk menjalankannya. Jika ini adalah skrip shell, hash-bang akan diuraikan dengan benar dan jika ini adalah biner yang dapat dieksekusi, ia hanya akan berjalan secara asli.sumber
Kedua metode ini sering dapat bertindak sama tetapi sangat berbeda.
sh ./script
menjalankansh
perintah dengan argumen./script
, yang terjadi untuk mengeksekusi skrip yang diberikan .. bahkan jika skrip sebenarnya bukansh
skrip (buruk)./script
mengeksekusi file yang diberikan. Ia melakukan ini dengan mencari baris "shebang" untuk menentukan perintah apa yang harus dijalankan. Jika tidak ditentukan itu menggunakansh
(ini dua metode kadang-kadang bertindak sama), tetapi sering penerjemah yang berbeda ditentukan ..Misalnya, jika
filename
berisi yang berikut ini:..kemudian kedua perintah ini sangat berbeda:
Jika tidak ada garis shebang, keduanya sama:
sumber
Satu perbedaan penting adalah jika garis hashbang Anda memiliki parameter. Misalnya, jika skrip dimulai dengan
... dan Anda menjalankannya secara eksternal menggunakan
sh
ataubash
, baris itu akan ditafsirkan sebagai komentar dan diabaikan, sehingga-e
parameter (keluar saat gagal) tidak akan diproses. Jadi, diberikan skrip berikut:Output untuk
./script
hanya "Hello", tetapi output untuksh script
akanHello
diikuti olehgoodbye
, yang mungkin tidak dimaksudkan.set -e
Ngomong -ngomong, ini sebabnya Anda harus selalu menggunakan pernyataan terpisah (toh itu ide yang bagus - lebih sering daripada tidak, jika ada masalah pada skrip tengah, Anda tidak ingin diabaikan).sumber
Tidak
[sudo] chmod +x ./<scrupt>.run
membuat skrip dapat dieksekusi sehingga Anda dapat menjalankannya./<script>.run
.Dengan
[sudo] sh ./<script>.run
Anda dapat menjalankannya, bahkan jika itu tidak dapat dieksekusi.sumber