Menjalankan skrip dalam izin zsh - file

16

Saya bingung tentang mengeksekusi izin file yang tidak berperilaku seperti yang saya harapkan. Mungkin karena harapan saya salah. Bagaimanapun:

Saya memiliki file skrip, karena kesederhanaannya hanya disebut s, terletak di ~/bin. Demi contoh ini, file hanya berisi baris berikut:

#!/bin/zsh
echo "Test";

Sangat sederhana.

Saya menavigasi ke ~/bindirektori, dan chmodizin file suntuk 400- yaitu, hanya-baca untuk saya saja. Tidak ada izin eksekusi. Jadi saya mencoba menjalankan skrip dengan memasukkan jalannya, memberikan ini:

% ./s
zsh: permission denied: ./s

Sejauh ini baik. File tidak dapat dieksekusi karena izin yang salah. Izin menabrak hingga 500(mengeksekusi izin diberikan) juga berfungsi dengan baik - dengan izin ini, file mengeksekusi baik:

% ./s
Test

Ini semua seperti yang diharapkan. Tapi kemudian saya chmodizin kembali ke 400(mengeksekusi izin lagi), mencoba sourcefile, dan ini terjadi

% source s
Test

Meskipun izin 400, skrip dijalankan.

Jadi inilah pertanyaan saya: mengapa ./sgagal (seperti seharusnya) tetapi source sdijalankan secara normal? Tidakkah ini mengalahkan seluruh tujuan dari izin eksekusi?

Atas 400izin, sh sdan zsh sjuga bekerja.

Saya yakin saya melakukan atau memahami sesuatu yang sangat salah di suatu tempat. Dapatkah seseorang titik di mana saya, dan menjelaskan perbedaan antara ./s, source s, sh sdan zsh s?

C106
sumber

Jawaban:

17

Ketika Anda menjalankan ./s, Anda memberi tahu kernel untuk menjalankan program s. Jika Anda memiliki izin eksekusi, maka kernel membaca beberapa byte pertama file, melihat #!barisnya sehingga ia tahu bahwa ini adalah skrip, dan menjalankan interpreter, meneruskannya nama skrip sebagai argumen pertama. Jika Anda tidak memiliki izin eksekusi, kernel membatalkan eksekusi pada langkah pertama.

Ketika Anda menjalankan zsh s, Anda menjalankan zsh, dan menyuruhnya untuk membaca file yang dipanggil sdan menafsirkannya sebagai perintah. Anda tidak mengeksekusi s, Anda mengeksekusi zsh. Hal yang sama dengan sh satau cat s.

Ketika Anda menjalankan source s, sekali lagi, Anda memberi tahu zsh untuk membaca file, jadi yang penting adalah Anda telah membaca izin untuk itu.

Gilles 'SO- berhenti menjadi jahat'
sumber
Oke, itu masuk akal. Tapi bukankah itu sepenuhnya mengalahkan titik memiliki izin eksekusi? Tidak masalah apakah disetel atau tidak, saya akan selalu dapat menjalankan skrip (atau memberi tahu zsh untuk menafsirkan perintah dalam skrip, yang setara).
C106
Juga, cat scukup cetak isi file. cat s | zshmeneruskannya ke zshdan dicetak Test.
C106
1
@ C106 Maksud dari izin eksekusi adalah untuk menunjukkan bahwa file tersebut mewakili sesuatu yang dapat Anda jalankan tanpa informasi tambahan. Ini juga penting jika file tersebut adalah setuid / setgid. Suatu file mungkin tidak memiliki izin eksekusi tetapi tetap berisi instruksi bahwa beberapa program komputer dijalankan.
Gilles 'SANGAT berhenti menjadi jahat'
Itu masuk akal, dan sebenarnya sangat jelas. Terima kasih.
C106