Sous Unix, quelle est la différence entre un script shell et un exécutable?

Réponses:

12

Un exécutable fait référence à tout fichier avec le jeu de bits exécutables qui pourrait être exécuté (même s'il y a des erreurs dans le fonctionnement réel du programme).

Un script shell est un type spécifique d'exécutable destiné à être interprété par un shell utilisant la #!directive pour spécifier un interpréteur.

Chris Down
la source
12

Un script est un fichier qui:

  • est lisible par l'homme (au moins pour un humain raisonnablement formé, c'est-à-dire que le fichier est composé de caractères imprimables); et
  • est compris par un interprète comme des instructions décrivant le comportement d'un programme.

Un script shell est un script dont l'interpréteur est un shell . Dans le monde unix, «coquille» fait référence à la famille des coquilles qui ressemblent à la coquille Bourne ; ces coques modernes (frêne, bash, ksh, zsh,…) sont conformes à la norme shell POSIX . Plus généralement, le mot «shell» peut inclure d'autres interpréteurs de commandes tels que csh, tcsh, fish,…


Un exécutable est un fichier qui peut être exécuté. Pour être efficacement exécutable, un fichier doit avoir deux propriétés:

  • L'utilisateur doit avoir l'autorisation de l'exécuter. Cela peut être vu avec la commande ls -l: le xpersonnage doit être présent dans la colonne d'autorisation.
  • Le format du fichier doit être celui que le système reconnaît comme exécutable. Les formats exécutables peuvent être divisés en plusieurs catégories:

    • Les exécutables natifs, qui consistent en du code machine organisé selon la disposition des exécutables binaires du système d'exploitation. La plupart des systèmes Unix modernes utilisent le format ELF pour leurs exécutables natifs.
    • Scripts. Un script exécutable est un fichier commençant par une ligne de shebang , composé des deux caractères #!suivis d'un chemin d'accès à un fichier. Pour exécuter un tel fichier, le noyau exécute le programme interpréteur et lui passe le chemin du script comme argument.
    • Peut-être d'autres formats selon le système. Par exemple, Linux peut enregistrer des formats de fichiers arbitraires via la fonction binfmt_misc . Cela permet aux fichiers de bytecode Java d'être exécutés via une machine virtuelle Java enregistrée , les exécutables Windows d'être exécutés via Wine , etc.

Notez qu'être un exécutable dépend du système. Par exemple, un binaire amd64 Linux est exécutable sur un système Linux amd64 mais pas sur un système 32 bits. Un binaire pour Android n'est pas exécutable sur une installation Linux normale. Un exécutable Windows n'est exécutable sur Linux que si Wine est présent. Un script qui commence par #!/usr/local/bin/rubyn'est exécutable que si un programme se trouve sur /usr/local/bin/ruby.


Un script shell est généralement exécutable. Mais il peut être non exécutable si vous n'avez pas la permission de l'exécuter. Vous pouvez toujours le faire interpréter en le passant explicitement à l'interpréteur (par exemple bash /path/to/script) - «faites-le interpréter» est une façon élégante de dire «exécuter».

Gilles 'SO- arrête d'être méchant'
la source
2

shell-script:

Un script shell est une série de commandes qui seront interprétées par un shell (généralement sh ou un shell compatible sh, parfois un autre.)

Le nom du script peut, mais ne doit PAS nécessairement, se terminer par ".sh" ou ".bash" ou ".csh" etc (donnant une indication sur le shell par lequel il doit être lancé).

Pour plus de clarté, je suppose que le nom du script est script, et le shell dans lequel il doit être lancé est bash.

Une manière typique de le lancer en shell serait alors: bash /absolute/path/to/the/scriptou bash ./relative/path/to/the/script. De cette façon, il n'est pas nécessaire que le bit exécutable soit défini, car il n'est lu que par bash, qui exécute ensuite le contenu.

Il peut également être défini + x (exécutable) pour permettre de le lancer directement à partir de votre session shell actuelle avec: / absolu / chemin / vers / le script (ou ./relative/path/to/the/script). Attention: par défaut, lorsqu'il est lancé de cette façon, il est lancé via le shell que vous avez tapé ou via un shell posix (le comportement dépend du système d'exploitation), il peut donc ne pas être le shell par lequel il est censé être exécuté. C'est pourquoi vous pouvez (et devriez) spécifier comme première ligne du script: #! / Path / to / good / shell qui indique à votre système d'exploitation que ce script doit vraiment être lancé par / path / to / good / shell à la place.

exécutable:

Un exécutable est un fichier dont le bit "x" est défini pour le (s) utilisateur (s) / groupe (s) par lequel il est censé être lancé. Il peut s'agir généralement d'un "binaire" ou d'un script.

Astuce: file /some/filepeut vous en dire plus sur le contenu du fichier. Essayez file /usr/bin/bashou file /etc/profilepour voir quelques exemples.

Olivier Dulac
la source
Votre déclaration sur les scripts shebangless exécutés par votre shell actuel est incorrecte. Le comportement dépend du système d'exploitation. Généralement, un shell POSIX ou votre shell de connexion sont utilisés.
jlliagre
Merci pour cette précision. Je modifierai ma réponse pour ajouter votre commentaire.
Olivier Dulac