Perbedaan antara + x dan ./ <script> dan sh ./ <script>

13

Apakah ada perbedaan aktual antara menjalankan skrip dengan

[sudo] sh ./<script>.run

dari pada

[sudo] chmod +x ./<script>.run
[sudo] ./<script>.run
pengguna36976
sumber

Jawaban:

18

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.

Florian Diesch
sumber
1
Seperti yang saya katakan dalam jawaban olis: Saya memeriksa executable saya menjalankan shebang-nya / bin / sh jadi mungkin baik-baik saja, sakit menunggu dan melihat apakah ada yang punya info lain dan kemudian menerima jawaban
user36976
7

Selama shskrip shell (Dash, atau yang setara), tidak, tidak ada perbedaan luar.

Masalahnya adalah .runtidak 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 chmodmematikannya (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.

Oli
sumber
Ah tidak tahu bahwa terima kasih atas jawabannya, baru saja memeriksa executable yang saya jalankan hash-bang adalah / bin / sh jadi saya pikir tidak masalah
user36976
1

Kedua metode ini sering dapat bertindak sama tetapi sangat berbeda.

sh ./scriptmenjalankan shperintah dengan argumen ./script, yang terjadi untuk mengeksekusi skrip yang diberikan .. bahkan jika skrip sebenarnya bukan shskrip (buruk)

./scriptmengeksekusi 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 filenameberisi 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
dbr
sumber
1

Satu perbedaan penting adalah jika garis hashbang Anda memiliki parameter. Misalnya, jika skrip dimulai dengan

#!/bin/bash -e

... dan Anda menjalankannya secara eksternal menggunakan shatau bash, baris itu akan ditafsirkan sebagai komentar dan diabaikan, sehingga -eparameter (keluar saat gagal) tidak akan diproses. Jadi, diberikan skrip berikut:

#!/bin/bash -e
echo Hello
false
echo goodbye

Output untuk ./scripthanya "Hello", tetapi output untuk sh scriptakan Hellodiikuti oleh goodbye, yang mungkin tidak dimaksudkan.

set -eNgomong -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).

Lutzky
sumber
0

Tidak

[sudo] chmod +x ./<scrupt>.runmembuat skrip dapat dieksekusi sehingga Anda dapat menjalankannya ./<script>.run.
Dengan [sudo] sh ./<script>.runAnda dapat menjalankannya, bahkan jika itu tidak dapat dieksekusi.

Pabi
sumber