web-dev-qa-db-fra.com

Exécution d'un script dans ZSH - Autorisations de fichier

Je suis confus sur l'exécution des autorisations de fichier ne pas se comporter comme je m'attends. Probablement parce que mes attentes sont erronées. De toute façon:

J'ai un fichier de script, pour la simplicité est simplement appelé s, situé dans ~/bin. Par souci de cet exemple, le fichier contient uniquement les lignes suivantes:

#!/bin/zsh
echo "Test";

Très simple.

Je navigue jusqu'au ~/bin répertoire, et chmod les autorisations de fichier de s à 400 - I.e., en savoir que pour moi seulement. Pas d'exécution de l'autorisation. Alors j'essaie ensuite d'exécuter le script en entrant dans 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 des mauvaises autorisations. Bumbing Autorisations jusqu'à 500 (exécution autorisation accordée) fonctionne aussi bien - avec ces autorisations, le fichier exécute bien:

% ./s
Test

C'est tout comme prévu. Mais alors je chmod autorisations reculez jusqu'à 400 (exécutez à nouveau la permission), essayez sourceing le fichier, et cela se produit:

% source s
Test

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

Alors voici ma question: pourquoi ./s échoue (comme si cela devrait) mais source s s'exécute normalement? Cela ne vaingait-il pas tout le but de l'autorisation d'exécution?

À 400 Autorisations, sh s et zsh s aussi fonctionne.

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

17
C106

Quand vous courez ./s, vous dites au noyau d'exécuter le programme s. Si vous avez une autorisation d'exécution, le noyau lit les premiers octets du fichier, voit le #! Ligne de sorte qu'il sait qu'il s'agit d'un script et exécute l'interprète, ce qui lui transmet le nom du script comme premier argument. Si vous n'avez pas l'exécution de l'autorisation, le noyau aborte l'exécution à la première étape.

Quand vous courez zsh s, vous exécutez zsh et dites-le de lire le fichier appelé s et interprétez-le sous forme de commandes. Vous n'exécutez pas s, vous exécutez zsh. Même chose avec sh s ou cat s.

Quand vous courez source s, encore une fois, vous dites à ZSH de lire un fichier, alors ce qui compte, c'est que vous avez lu la permission.