466 votes

Comment faire pour exécuter une .sh-script dans une console Unix/Mac terminal?

Je sais, l'oublier et réapprendre à nouveau. Le temps de l'écrire.

864voto

lhunath Points 27045

Pour exécuter un non-exécutable sh script, utilisez:

sh myscript

Pour exécuter un non-exécutable bash script, utilisez:

bash myscript

Pour lancer un fichier exécutable (qui est un fichier exécutable avec l'autorisation); il suffit de le spécifier par son chemin d'accès:

/foo/bar
/bin/bar
./bar

De faire un script exécutable, lui donner l'autorisation nécessaire:

chmod +x bar
./bar

Lorsqu'un fichier est exécutable, le noyau est chargé de trouver comment execte. Pour les non-binaires, c'est fait à la première ligne du fichier. Il doit contenir une hashbang:

#! /usr/bin/env bash

Le hashbang indique au noyau de ce programme à exécuter (dans ce cas, la commande /usr/bin/env est exécuté avec l'argument bash). Ensuite, le script transmis au programme (deuxième argument) avec tous les arguments que vous avez donné le script comme les arguments suivants.

Cela signifie que chaque script est exécutable doit avoir un hashbang. Si ça ne marche pas, vous n'êtes pas à dire le noyau de ce qu'il est, et, par conséquent, le noyau ne sais pas quel programme utiliser pour interpréter. Il pourrait être bash, perl, python, sh, ou quelque chose d'autre. (En réalité, le noyau est souvent utiliser par défaut de l'utilisateur shell pour interpréter le fichier, ce qui est très dangereux car il pourrait ne pas être le bon interprète, ou il pourrait être en mesure d'analyser certaines de mais avec de subtiles différences comportementales comme c'est le cas entre sh et bash).

Une note sur l' /usr/bin/env

Le plus souvent, vous verrez hachage frange de la sorte:

#!/bin/bash

Le résultat est que le noyau va exécuter le programme d' /bin/bash d'interpréter le script. Malheureusement, bash n'est pas toujours livrés par défaut, et il n'est pas toujours disponible en /bin. Alors que sur Linux, il est généralement, il existe une série d'autres POSIX machines, bash des navires dans divers endroits, tels que l' /usr/xpg/bin/bash ou /usr/local/bin/bash.

Pour écrire un portable script bash, on ne peut donc pas compter sur les coder en dur l'emplacement de l' bash programme. POSIX dispose déjà d'un mécanisme pour traiter avec que: PATH. L'idée est que vous installez vos programmes dans l'un des répertoires qui sont dans PATH , et le système doit être en mesure de trouver votre programme lorsque vous souhaitez exécuter par son nom.

Malheureusement, vous ne peut pas simplement faire ceci:

#!bash

Le noyau ne va pas (certains peuvent) faire un PATH la recherche pour vous. Il y a un programme qui peut faire un PATH recherche pour vous, même si, il est appelé env. Heureusement, presque tous les systèmes ont un env programme installé dans /usr/bin. Donc, nous commençons env codé en dur à l'aide d'un chemin, puis un PATH recherche bash et s'exécute en sorte qu'il peut interpréter votre script:

#!/usr/bin/env bash

Cette approche a un inconvénient: Selon POSIX, le hashbang peut avoir un argument. Dans ce cas, nous utilisons bash que l'argument de l' env programme. Cela signifie que nous n'avons pas d'espace à gauche pour passer des arguments au bash. Donc il n'y a aucun moyen de convertir quelque chose comme #!/bin/bash -exu de ce schéma. Vous pourrez set -exu après la hashbang à la place.

Cette approche a aussi un autre avantage: Certains systèmes sont livrés avec un /bin/bash, mais l'utilisateur peut ne pas aimer, peut trouver, c'est buggy ou obsolètes, et peut-être installé sa propre bash ailleurs. C'est souvent le cas sur OS X (Mac) où Apple navires de la vétusté /bin/bash et aux utilisateurs d'installer une mise à jour, /usr/local/bin/bash en utilisant quelque chose comme Homebrew. Lorsque vous utilisez l' env démarche qui ne un PATH de recherche, vous prenez la préférence de l'utilisateur en compte et d'utiliser son préféré bash sur l'un de son système livré avec.

71voto

P-A Points 2026

Pour démarrer le shell-script 'file.sh':

sh file.sh

bash file.sh

Une autre option est exécutable permission utilisant la commande chmod:

chmod +x file.sh

Maintenant exécuter .sh fichier comme suit:

./file.sh

10voto

Chas. Owens Points 40887

Si vous voulez exécuter le script dans le shell courant (par exemple, vous voulez qu'il soit en mesure d'affecter votre répertoire ou de l'environnement), vous devez dire:

. /path/to/script.sh

ou

source /path/to/script.sh

Notez que /path/to/script.sh ne peut être que relative, par exemple, . bin/script.sh exécute l' script.sh dans la bin répertoire dans le répertoire courant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: