13 votes

Différentes façons d'exécuter des binaires et des scripts

J'utilise Linux depuis un certain temps maintenant et je cherche une vue d'ensemble complète sur ce sujet mais je n'en ai trouvé aucune.

Je n'arrive tout simplement pas à comprendre toutes les différentes façons d'exécuter des scripts et des binaires - c'est un vrai fouillis pour moi et je dois procéder par essais et erreurs pour déterminer ce que je dois utiliser. Pour un fichier qui est un script ou un binaire </code>, je peux proposer les alternatives suivantes :</p> <pre><code><script/binary> . <script/binary> ./<script/binary> source <script/binary> sh <script/binary> </code></pre> <p>(Y a-t-il d'autres alternatives ?)</p> <p>Est-ce que quelqu'un pourrait donner une vue d'ensemble complète des commandes qui fonctionnent avec chaque type de fichiers, et quelle est la différence quand il y a plusieurs options ?</p> <p>Merci.</p></x-turndown>

9voto

Lekensteyn Points 162346

Les commandes suivantes sont les mêmes, un composant de point signifie "répertoire actuel". Pour pouvoir être exécutés, les fichiers doivent avoir des permissions d'exécution :

chemin/vers/binaire
./chemin/vers/binaire

Notez que si un chemin ne contient pas de barre oblique, il est traité comme une commande (soit une commande intégrée au shell, soit un programme qui est recherché dans la variable d'environnement $PATH).

Les suivantes sont presque les mêmes, elles exécutent un script shell (pas un binaire !) dans l'environnement shell actuel. Une petite différence entre les deux lignes est décrite dans cette question Unix.SE.

. chemin/vers/script
source chemin/vers/script

Enfin, vous avez mentionné sh script. Encore une fois, cela ne fonctionne que pour les scripts shell et non pour les binaires. Vous exécutez essentiellement le programme sh avec le nom du script comme argument. Dans le cas de sh, il traite simplement cet argument comme un script shell et l'exécute.

Pour des réponses limitées aux scripts shell, consultez Différentes façons d'exécuter un script shell.

6voto

Carl Points 819

Merci pour toutes les contributions. Je vais essayer de répondre à ma propre question maintenant et fournir un guide complet des différentes possibilités pour exécuter des scripts et des binaires. Veuillez modifier et commenter et nous pourrons trouver quelque chose de complet et correct. Voici ma suggestion :

Tout d'abord, deux points à énoncer :

  • Linux fait une distinction entre une commande et un chemin. Une commande est simplement tapée telle quelle sur l'invite de commande, et exécutera une fonction intégrée ou fera en sorte que Linux cherche un binaire correspondant ou un script dans le $PATH.

  • Pour que Linux interprète quelque chose comme un chemin, il doit contenir au moins un slash (/). Par exemple, dans ./monScript, ./ peut sembler assez redondant - il est là uniquement pour que Linux l'interprète comme un chemin plutôt qu'une commande.

Donc, les options pour exécuter un binaire ou un script :

Exécution d'un binaire binaire :

$ binaire          # lorsque 'binaire' est sur le PATH, ou est une fonction intégrée
$ ./binaire        # lorsque 'binaire' n'est pas sur le chemin mais dans le répertoire actuel
$ /home/moi/binaire # lorsque 'binaire' n'est pas sur le PATH, et pas dans le répertoire actuel

Exécution d'un script script :

Le fichier devra avoir des permissions d'exécution sauf indication contraire.

$ script        # exécuter un script qui est sur le PATH. Sera exécuté dans un nouveau shell.
                # L'interpréteur à utiliser est déterminé par le she-bang dans le fichier.
$ ./script      # exécuter un script qui est dans le répertoire actuel. Sinon comme ci-dessus.
$ /un/chemin/script # lorsque le script n'est pas sur le PATH et non dans le répertoire actuel. 
                # Sinon comme ci-dessus.
$ . script      # exécute un script dans le répertoire actuel. Sera exécuté dans
                # l'environnement shell actuel.
$ source script # équivalent à ce qui précède *1
$ sh script     # exécute 'script' dans un nouveau shell *2 (il en va de même pour 'bash ...', 'zsh ...' etc.). Permission d'exécution non nécessaire.

À propos des she-bangs :

Les scripts avec un she-bang (par exemple, #!/bin/sh) sur la première ligne indiquent quel interpréteur utiliser.

  • Cet interpréteur sera utilisé lorsqu'il sera exécuté avec ./script ou en utilisant une commande : script (script doit être sur le PATH)
  • Utiliser sh script ignorera le she-bang et utilisera, dans ce cas, sh comme interpréteur
  • Utiliser . script ou source ignorera le she-bang et utilisera l'interpréteur actuel (puisque . ou source équivaut à exécuter chaque ligne du script dans le shell actuel)

Notes de bas de page

*1 : Cela est seulement presque vrai. En bash, ce sont effectivement les mêmes commandes, mais en utilisant source, script sera recherché dans $PATH avant le répertoire actuel. C'est bash, mais dans les shells uniquement POSIX, source ne fonctionne pas, mais . oui. Donc il vaut mieux utiliser ce dernier pour la portabilité.

*2 : en réalité, ce qui se passe est que nous exécutons le binaire sh avec 'script' en argument, ce qui fera que 'sh' exécute 'script' dans son nouveau shell

2voto

Voici une liste rapide de commandes. Notez que lorsque je mentionne PATH, je fais référence aux répertoires contenant des programmes que le système connaît; vous pouvez les trouver avec echo $PATH, et cela ressemblera à ceci : /home/mike/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Scripts

  • Pour exécuter un script dans le répertoire de travail actuel, utilisez ./myscript.sh

  • Pour exécuter un script sur un autre fichier, utilisez (s'il est dans le répertoire de travail actuel), ./myscript.sh textfile.txt

  • Les scripts peuvent également être exécutés avec des arguments; comme expliqué dans Rute (p. 68) : myfile.sh dogs cats birds affichera Le premier argument est : dogs, le deuxième argument est : cats, le troisième argument est : birds car le contenu de ce script après le shebang est : echo "Le premier argument est : $1, le deuxième argument est : $2, le troisième argument est : $3"

  • Pour exécuter un script dans un autre répertoire, utilisez ~/Scripts/dogs.sh

  • Pour exécuter un script que le système connaît car il se trouve dans votre dossier bin de votre répertoire personnel (créez-le si ce n'est pas le cas, car il sera automatiquement ajouté à votre PATH), il suffit d'utiliser scriptname

  • Pour exécuter un script que vous avez installé, utilisez à nouveau son nom, car il sera connu du système : par exemple, get_iplayer

Binaires

  • Pour exécuter un binaire que le système connaît car il est dans $PATH, utilisez le nom du programme et tout paramètre, par exemple, vlc
  • Pour tester un binaire que vous avez compilé avant de l'installer dans /usr/local/bin, ou pour maintenir un programme autonome à l'écart du système, utilisez ~//app/myprog

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X