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

11

J'utilise Linux depuis un certain temps maintenant et je cherchais un aperçu complet de cela, mais je n'en ai trouvé aucun.

Je ne comprends tout simplement pas les différentes manières d'exécuter des scripts et des binaires - tout cela est un gros gâchis pour moi et je dois utiliser des essais et des erreurs pour déterminer ce que je dois utiliser. Pour un fichier qui est un script ou un binaire <script/binary>, je peux proposer les alternatives suivantes:

<script/binary>
. <script/binary>
./<script/binary>
source <script/binary>
sh <script/binary>

(Y en a-t-il plus?)

Quelqu'un peut-il donner un aperçu complet des commandes qui fonctionnent avec quels types de fichiers et quelle est la différence lorsqu'il existe plusieurs options?

Merci.

Carl
la source

Réponses:

7

Les commandes suivantes sont les mêmes, un composant point signifie "répertoire courant". Pour permettre leur exécution, les fichiers doivent disposer d'autorisations exécutables:

path/to/binary
./path/to/binary

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

Les éléments suivants sont presque les mêmes, ils exécutent un script shell (pas un binaire!) Dans l'environnement shell actuel. Une petite différence entre les deux lignes sont décrites sur cette question Unix.SE .

. path/to/script
source path/to/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 shprogramme 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 les réponses limitées aux scripts shell, voir Différentes façons d'exécuter un script shell .

Lekensteyn
la source
3

Merci pour toute la contribution. 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 proposer quelque chose de complet et de correct. Voici ma suggestion:

Dans un premier temps, deux points à préciser:

  • Linux fait une distinction entre une commande et un chemin . Une commande est tapée telle quelle à l'invite et exécutera une commande intégrée ou obligera Linux à rechercher un binaire ou un script correspondant sur $ PATH.

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

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

Exécuter un binaire binary:

$ binary          # when 'binary' is on the PATH, or is a built-in
$ ./binary        # when 'binary' is not on the path but in the current directory
$ /home/me/binary # when 'binary' is not on the PATH, and not in the current dir

Exécuter un script script:

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

$ script        # execute a script that is on PATH. Will be executed in a new shell.
                # The interpreter to use is determined by the she-bang in the file.
$ ./script      # execute a script that is in the current dir. Otherwise as above.
$ /a/dir/script # when the script is not on the PATH and not in current dir. 
                # Otherwise as above.
$ . script      # execute a script in the current dir. Will be executed in the
                # current shell environment.
$ source script # equivalent to the above *1
$ sh script     # executes 'script' in a new shell *2 (the same goes for 'bash ...',
                # 'zsh ...' etc.). Execute permission not neccessary.

À propos de la frange :

Les scripts avec un coup (par exemple #!/bin/sh) sur la première ligne indiquent quel interprète utiliser.

  • Cet interpréteur sera utilisé lorsqu'il sera exécuté par ./scriptou en utilisant une commande: script( scriptdoit être sur le CHEMIN)
  • L'utilisation sh scriptignorera le coup et utilisera, dans ce cas, shcomme interprète
  • Utiliser . scriptou sourceignorera le she-bang et utilisera l'interpréteur actuel (car .ou sourceéquivaut à simplement exécuter chaque ligne du script dans le shell actuel)

Notes de bas de page

* 1: Ce n'est que presque vrai. En bash ce sont en effet la même commande, mais lors de l'utilisation source, scriptseront recherchés dans $ PATH avant le répertoire courant. C'est bash, mais dans les shells POSIX uniquement, sourcecela ne fonctionne pas, mais .ça marche . Utilisez donc plutôt ce dernier pour la portabilité.

* 2: ce qui se passe en fait, c'est que nous exécutons le sh binaire avec 'script' comme argument, ce qui fera que 'sh' exécutera 'script' dans son nouveau shell

Carl
la source
2

Voici une liste rapide des commandes. Notez, quand je mentionne PATH, je veux dire les répertoires contenant des programmes que le système connaît; vous les trouverez avec echo $PATH, et ce sera quelque chose comme:/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 se trouve dans le répertoire de travail courant), ./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 birdssortira The first argument is: dogs, second argument is: cats, third argument is: birdscar le contenu de ce script après le shebang est:echo "The first argument is: $1, second argument is: $2, third argument is: $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 dans votre répertoire personnel (il suffit de le créer s'il n'est pas là, car il sera automatiquement ajouté à votre PATH), utilisez simplement scriptname
  • Pour exécuter un script que vous avez installé, utilisez simplement son nom, car il sera connu du système: par exemple, get_iplayer

Binaires

  • Pour exécuter un binaire connu du système car il se trouve dans $ PATH, utilisez le nom du programme et tous les paramètres, par exemple, vlc <stream url to open>
  • Pour tester un binaire que vous avez compilé avant de l'installer dans / usr / local / bin, ou pour éloigner un programme autonome du système, utilisez ~/<folder>/app/myprog

la source
Merci pour l'information. Cette déclaration est-elle correcte: pour exécuter un script ou un binaire qui n'est pas dans PATH, il suffit de spécifier son chemin. La raison pour laquelle ./ est nécessaire pour un script dans le chemin actuel est que juste 'script.sh' serait interprété comme une commande car il manque au moins une barre oblique /.
Carl
"Pour exécuter un script que vous avez installé", qu'est-ce qu'un script que j'ai "installé"? Ce point dit-il la même chose que le point précédent?
Carl
@ Carl- votre premier commentaire est correct, mais il n'est pas vrai de dire que mes deux derniers points sur les scripts sont les mêmes. Au point 5 de la section des scripts, je parlais des scripts que l'utilisateur a ajoutés manuellement à son dossier bin dans son répertoire personnel; au point 6, je parlais de scripts tels que get_iplayer qu'ils ont installés à partir des référentiels et, en tant que tels, vont toujours dans les dossiers système, pas dans le répertoire personnel de l'utilisateur.
Désolé mais je ne comprends toujours pas cela, un script dans ~ / bin / (qui est dans PATH) ou dans un dossier système (qui est dans PATH) - comment peut-il y avoir une différence entre eux? Se comportent-ils différemment?
Carl
Je faisais juste une distinction entre les scripts que l'utilisateur possède et ajoute dans ~ / bin et ceux qui appartiennent à root dans les dossiers système.