Exécuter un script dans zsh - autorisations de fichiers

16

Je suis confus quant à l'exécution des autorisations de fichier ne se comportant pas comme je m'y attendais. Probablement parce que mes attentes sont fausses. En tous cas:

J'ai un fichier script, pour la simplicité vient d'être appelé s, situé dans ~/bin. Pour cet exemple, le fichier contient uniquement les lignes suivantes:

#!/bin/zsh
echo "Test";

Très simple.

Je navigue vers le ~/binrépertoire et chmodles autorisations de fichier de - c'est- sà 400-dire en lecture seule pour moi uniquement. Aucune autorisation d'exécution. Alors j'essaie d'exécuter le script en entrant son chemin, en donnant ceci:

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

Jusqu'ici tout va bien. Le fichier ne peut pas être exécuté en raison de mauvaises autorisations. Augmenter les autorisations jusqu'à 500(exécuter l'autorisation accordée) fonctionne également très bien - avec ces autorisations, le fichier s'exécute correctement:

% ./s
Test

Tout est comme prévu. Mais ensuite, je chmodredescends vers 400(exécuter à nouveau la permission), en essayant sourcele fichier, et cela se produit:

% source s
Test

Bien que les autorisations le soient 400, le script s'exécute.

Voici donc ma question: pourquoi ./séchoue (comme il se doit) mais source ss'exécute normalement? Cela ne va-t-il pas à l'encontre du but de l'autorisation d'exécution?

Aux 400autorisations, sh set zsh saussi travailler.

Je suis sûr que je fais ou que je comprends quelque chose d'horriblement mal quelque part. Quelqu'un peut -il point où pour moi, et expliquer la différence entre ./s, source s, sh set zsh s?

C106
la source

Réponses:

17

Lorsque vous exécutez ./s, vous dites au noyau d'exécuter le programme s. Si vous avez l'autorisation d'exécution, le noyau lit les premiers octets du fichier, voit la #!ligne pour savoir qu'il s'agit d'un script et exécute l'interpréteur en lui passant le nom du script comme premier argument. Si vous ne disposez pas de l'autorisation d'exécution, le noyau abandonne l'exécution à la première étape.

Lorsque vous exécutez zsh s, vous l'exécutez zshet lui dites de lire le fichier appelé set de l'interpréter comme des commandes. Vous n'exécutez pas s, vous exécutez zsh. Même chose avec sh sou cat s.

Lorsque vous exécutez source s, encore une fois, vous dites à zsh de lire un fichier, ce qui importe, c'est que vous ayez une autorisation de lecture sur celui-ci.

Gilles 'SO- arrête d'être méchant'
la source
D'accord, cela a du sens. Mais cela ne va-t-il pas complètement à l'encontre du point d'avoir l'autorisation d'exécution? Peu importe qu'il soit défini ou non, je pourrai toujours exécuter le script (ou dire à zsh d'interpréter les commandes du script, ce qui est équivalent).
C106
Imprime également cat sle contenu du fichier. cat s | zshles passe zshet imprime Test.
C106
1
@ C106 Le but de l'autorisation d'exécution est d'indiquer que le fichier représente quelque chose que vous pouvez exécuter sans informations supplémentaires. C'est également important si le fichier est setuid / setgid. Un fichier peut ne pas avoir de permission d'exécution, mais consiste néanmoins en des instructions indiquant qu'il arrive qu'un programme informatique quelque part s'exécute.
Gilles 'SO- arrête d'être méchant'
Cela a beaucoup de sens et est en fait incroyablement évident. Merci.
C106