Ejecutar un script en zsh - permisos de archivo

16

Estoy confundido acerca de que los permisos de ejecución de archivos no se comporten como esperaba. Probablemente porque mis expectativas son incorrectas. De todas formas:

Tengo un archivo de script, por simplicidad solo se llama s, ubicado en ~/bin. Por el bien de este ejemplo, el archivo contiene solo las siguientes líneas:

#!/bin/zsh
echo "Test";

Muy simple.

Navego hasta el ~/bindirectorio y chmodlos permisos de archivo de sto 400, es decir, solo lectura para mí. Sin permiso de ejecución. Entonces trato de ejecutar el script ingresando su ruta, dando esto:

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

Hasta aquí todo bien. El archivo no se puede ejecutar debido a los permisos incorrectos. El aumento de permisos hasta 500(permiso de ejecución concedido) también funciona bien: con estos permisos, el archivo se ejecuta bien:

% ./s
Test

Todo esto es como se esperaba. Pero luego vuelvo a los chmodpermisos 400(ejecutar el permiso nuevamente), intentando sourceel archivo, y esto sucede:

% source s
Test

Aunque los permisos son 400, el script se ejecuta.

Así que aquí está mi pregunta: ¿por qué ./sfalla (como debería) pero se source sejecuta normalmente? ¿Esto no vence el propósito completo del permiso de ejecución?

Con 400permisos, sh sy zsh stambién trabajo.

Estoy seguro de que estoy haciendo o entendiendo algo horriblemente mal en alguna parte. Puede señalar a alguien dónde a mí, y explicar la diferencia entre ./s, source s, sh sy zsh s?

C106
fuente

Respuestas:

17

Cuando ejecuta ./s, le dice al núcleo que ejecute el programa s. Si tiene permiso de ejecución, el núcleo lee los primeros bytes del archivo, ve la #!línea para saber que se trata de un script y ejecuta el intérprete, pasando el nombre del script como primer argumento. Si no tiene permiso de ejecución, el núcleo anula la ejecución en el primer paso.

Cuando ejecuta zsh s, ejecuta zsh, y le dice que lea el archivo llamado se interprete como comandos. No estás ejecutando s, estás ejecutando zsh. Lo mismo con sh so cat s.

Cuando ejecuta source s, nuevamente, le dice a zsh que lea un archivo, por lo que lo importante es que tenga permiso de lectura.

Gilles 'SO- deja de ser malvado'
fuente
Vale, eso tiene sentido. ¿Pero eso no vence por completo el punto de tener el permiso de ejecución? No importa si está configurado o no, siempre podré ejecutar el script (o decirle a zsh que interprete los comandos en el script, que es equivalente).
C106
Además, cat ssolo imprime el contenido del archivo. cat s | zshlos pasa zshe imprime Test.
C106
1
@ C106 El objetivo del permiso de ejecución es indicar que el archivo representa algo que puede ejecutar sin información adicional. También es importante si el archivo es setuid / setgid. Es posible que un archivo no tenga permiso de ejecución, pero no obstante consiste en instrucciones de que sucede que algún programa de computadora se ejecuta en algún lugar.
Gilles 'SO- deja de ser malvado'
Eso tiene mucho sentido, y de hecho es realmente increíblemente obvio. Gracias.
C106