web-dev-qa-db-fra.com

Comment exécuter un script Shell sur une console Unix ou un terminal Mac?

Je le sais, oublie ça et réapprends. Il est temps de l'écrire.

483
P-A

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

sh myscript

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

bash myscript

Pour démarrer un fichier exécutable (qui est n’importe quel fichier avec une autorisation exécutable); il suffit de le spécifier par son chemin:

/foo/bar
/bin/bar
./bar

Pour rendre un script exécutable, accordez-lui les autorisations nécessaires:

chmod +x bar
./bar

Lorsqu'un fichier est exécutable, le noya est chargé de trouver comment l'exécuter. Pour les non-binaires, cela se fait en regardant la première ligne du fichier. Il devrait contenir un hashbang:

#! /usr/bin/env bash

Le hashbang indique au noyau le programme à exécuter (dans ce cas, la commande /usr/bin/env est exécutée avec l'argument bash). Ensuite, le script est transmis au programme (en tant que second argument) avec tous les arguments que vous avez donnés au script en tant qu'arguments ultérieurs.

Cela signifie chaque script qui est exécutable devrait avoir un hashbang. Si ce n'est pas le cas, vous ne dites pas au noyau ce qu'il est , et le noyau ne sait donc pas quel programme utiliser pour l'interpréter. . Ce pourrait être bash, Perl, python, sh ou autre chose. (En réalité, le noyau utilisera souvent le shell par défaut de l'utilisateur pour interpréter le fichier, ce qui est très dangereux, car ce n'est peut-être pas le bon interprète ou il peut en analyser une partie, mais avec des différences de comportement subtiles telles que le cas entre sh et bash).

Une note sur /usr/bin/env

Le plus souvent, vous verrez une frange de hasch comme ceci:

#!/bin/bash

Le résultat est que le noyau exécutera le programme /bin/bash pour interpréter le script. Malheureusement, bash n'est pas toujours livré par défaut et il n'est pas toujours disponible dans /bin. Sur les machines Linux, c’est généralement le cas, mais il existe une gamme d’autres machines POSIX où bash est expédié à divers emplacements, tels que /usr/xpg/bin/bash ou /usr/local/bin/bash.

Pour écrire un script bash portable, nous ne pouvons donc pas compter sur le codage en dur de l'emplacement du programme bash. POSIX a déjà un mécanisme pour traiter cela: PATH. L'idée est que vous installiez vos programmes dans l'un des répertoires situés dans PATH et que le système puisse trouver votre programme lorsque vous souhaitez l'exécuter par nom.

Malheureusement, vous ne pouvez pas procédez comme suit:

#!bash

Le noyau ne fera pas (certains pourraient) faire une recherche PATH pour vous. Il y a un programme qui peut faire une recherche PATH pour vous, cependant, il s'appelle env. Heureusement, presque tous les systèmes ont un programme env installé dans /usr/bin. Nous commençons donc env en utilisant un chemin codé en dur, qui effectue ensuite une recherche PATH pour bash et l'exécute afin qu'il puisse interpréter votre script:

#!/usr/bin/env bash

Cette approche a un inconvénient: selon POSIX, le hashbang peut avoir n argument. Dans ce cas, nous utilisons bash comme argument du programme env. Cela signifie que nous n'avons plus d'espace pour passer des arguments à bash. Il n’ya donc aucun moyen de convertir quelque chose comme #!/bin/bash -exu à ce schéma. Vous devrez plutôt mettre set -exu après le hashbang.

Cette approche présente également un autre avantage: certains systèmes peuvent être livrés avec un /bin/bash, mais l’utilisateur peut ne pas l’aimer, peut trouver cela déformé ou obsolète et avoir installé sa propre bash ailleurs. C'est souvent le cas sous OS X (Mac) où Apple envoie un /bin/bash obsolète et les utilisateurs installent un /usr/local/bin/bash à jour en utilisant quelque chose comme Homebrew. Lorsque vous utilisez l'approche env qui effectue une recherche PATH, vous prenez en compte les préférences de l'utilisateur et utilisez son bash préféré par rapport à celui fourni avec son système.

914
lhunath

Pour démarrer le script shell 'fichier.sh':

sh file.sh

bash file.sh

Une autre option est de définir les autorisations des exécutables à l'aide de la commande chmod:

chmod +x file.sh

Maintenant, lancez le fichier .sh comme suit:

./file.sh
76
P-A

Pour le Bourne Shell:

sh myscript.sh

Pour bash:

bash myscript.sh
13
anon

Si vous souhaitez que le script s'exécute dans le shell actuel (par exemple, vous voulez qu'il puisse affecter votre répertoire ou votre environnement), vous devez indiquer:

. /path/to/script.sh

ou 

source /path/to/script.sh

Notez que /path/to/script.sh peut être relatif. Par exemple, . bin/script.sh exécute le script.sh dans le répertoire bin sous le répertoire actuel.

10
Chas. Owens

L'extension de fichier .command est attribuée à Terminal.app. Double-cliquez sur un fichier .command pour l'exécuter.

0
benwiggy

Tout d'abord, donnez la permission pour l'exécution: -
chmod +x script_name 

  1. Si le script n'est pas exécutable: -
    Pour exécuter le fichier de script sh: -
    sh script_name
    Pour exécuter le fichier de script bash: -
    bash script_name
  2. Si le script est exécutable: -
    ./script_name

NOTE: - vous pouvez vérifier si le fichier est exécutable ou non en utilisant 'ls -a'

0
Vineet Jain