Apakah ada perbedaan aktual antara menjalankan skrip dengan
[sudo] sh ./<script>.run
dari pada
[sudo] chmod +x ./<script>.run
[sudo] ./<script>.run
Apakah ada perbedaan aktual antara menjalankan skrip dengan
[sudo] sh ./<script>.run
dari pada
[sudo] chmod +x ./<script>.run
[sudo] ./<script>.run
Jawaban:
Jika Anda menggunakan
sh ./<script>.run
/bin/sh
(biasanya shell Bourne) akan digunakan untuk menjalankan skrip. Tentu saja ini hanya berfungsi jika skrip ditulis untuk Bourne shell. Terkadang skrip shell untuk Linux membutuhkan Bash, bukan Bourne shell, jadi ini mungkin tidak berfungsi meskipun itu adalah skrip shell.
Jika Anda menggunakan
./<script>.run
kernel melihat baris shebang untuk mencari tahu program mana yang digunakan untuk menjalankan program. Jadi ini berfungsi bahkan jika itu adalah Bash, Perl, Python atau skrip lainnya.
Jadi ini biasanya cara yang disukai untuk menjalankan skrip.
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 memaksanya sh
, 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.
Kedua metode ini sering dapat bertindak sama tetapi sangat berbeda.
sh ./script
menjalankan sh
perintah dengan argumen ./script
, yang terjadi untuk mengeksekusi skrip yang diberikan .. bahkan jika skrip sebenarnya bukan sh
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 menggunakan sh
(ini dua metode kadang-kadang bertindak sama), tetapi sering penerjemah yang berbeda ditentukan ..
Misalnya, jika filename
berisi yang berikut ini:
#!/usr/bin/python
print "This is a Python script!"
..kemudian kedua perintah ini sangat berbeda:
$ sh script
script: line 3: print: command not found
$ chmod +x script
$ ./script
This is a Python script!
Jika tidak ada garis shebang, keduanya sama:
$ cat script
echo "This is an sh script"
$ sh ./script
This is an sh script
$ ./script
This is an sh script
Satu perbedaan penting adalah jika garis hashbang Anda memiliki parameter. Misalnya, jika skrip dimulai dengan
#!/bin/bash -e
... dan Anda menjalankannya secara eksternal menggunakan sh
atau bash
, baris itu akan ditafsirkan sebagai komentar dan diabaikan, sehingga -e
parameter (keluar saat gagal) tidak akan diproses. Jadi, diberikan skrip berikut:
#!/bin/bash -e
echo Hello
false
echo goodbye
Output untuk ./script
hanya "Hello", tetapi output untuk sh script
akan Hello
diikuti oleh goodbye
, 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).