web-dev-qa-db-fra.com

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

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 n'arrive tout simplement pas à accepter les différentes façons d'exécuter des scripts et des fichiers binaires - c'est tout un gâchis pour moi et je dois utiliser des essais et des erreurs pour déterminer ce que je devrais 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 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 entre plusieurs options?

Merci.

8
Carl

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

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

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

Les éléments suivants sont presque identiques, ils exécutent un script Shell (pas un fichier binaire!) Dans l'environnement Shell actuel. Une petite différence entre les deux lignes est décrite sur ce 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 les fichiers binaires. Vous exécutez essentiellement le programme sh avec le nom de script en argument. Dans le cas de sh, il considère simplement cet argument comme un script shell et l'exécute.

Pour les réponses restreintes aux scripts de shell, voir Différentes façons d’exécuter un script Shell .

4
Lekensteyn

Merci pour toute la contribution. Je vais essayer de répondre à ma propre question maintenant et de fournir un guide complet sur les différentes possibilités d'exécution de scripts et de fichiers binaires. Veuillez éditer et commenter et nous pourrons proposer quelque chose de complet et de correct. Voici ma suggestion:

Au début, deux points à préciser:

  • Linux fait la distinction entre une commande et un chemin . Une commande est uniquement saisie telle quelle dans l'invite, et exécutera une commande intégrée ou fera en sorte que Linux recherche le binaire ou le script correspondant. sur le $ 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 existe uniquement pour que Linux l'interprète comme un chemin plutôt que comme une commande.

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

Exécution d'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écution d'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 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é par ./script ou en utilisant une commande: script (script doit figurer sur le chemin PATH).
  • Utiliser sh script ignorera le she-bang et utilisera, dans ce cas, sh comme interprète
  • Utiliser . script ou source ignorera le she-bang et utilisera l'interpréteur actuel (puisque . ou source équivaut à simplement exécuter chaque ligne du script dans le shell actuel)

Notes

* 1: Ce n'est que presque vrai. En bash, il s’agit bien de la même commande, mais lorsqu’on utilise source, script sera recherché dans $ PATH avant le répertoire en cours . C'est bash, mais dans les shells POSIX-only, source ne fonctionne pas, mais . si. Utilisez donc plutôt ce dernier pour la portabilité.

* 2: ce qui se passe réellement, c'est que nous lançons le sh binaire avec 'script' en argument, ce qui fera que 'sh' exécutera 'script' dans son nouveau shell

3
Carl

Voici une liste rapide des commandes. Notez que lorsque je parle de PATH, je parle des répertoires contenant des programmes connus du système; vous trouvez ceux 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 en cours, utilisez ./myscript.sh
  • Pour exécuter un script sur un autre fichier, utilisez (s'il se trouve dans le répertoire de travail en cours), ./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 générera The first argument is: dogs, second argument is: cats, third argument is: birds car le contenu de ce script après 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 connu du système car il se trouve dans votre dossier bin de votre répertoire personnel (créez-le simplement s'il n'est pas présent, car il sera automatiquement ajouté à votre CHEMIN), utilisez simplement scriptname.
  • Pour exécuter un script que vous avez installé, utilisez à nouveau simplement son nom, car il sera connu du système: par exemple, get_iplayer

Binaires

  • Pour exécuter un fichier 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 garder un programme autonome à l'écart du système, utilisez ~/<folder>/app/myprog
2
user76204