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


Je le sais, oublie-le et réapprends-le à nouveau. Il est temps de l'écrire.


470
2018-04-09 11:36


origine


Réponses:


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 démarrer un fichier exécutable (qui est un fichier avec une autorisation exécutable); vous venez de le spécifier par son chemin:

/foo/bar
/bin/bar
./bar

Pour rendre un script exécutable, donnez-lui l'autorisation nécessaire:

chmod +x bar
./bar

Lorsqu'un fichier est exécutable, le noyau est responsable de trouver comment l'exiter. 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 quel programme exécuter (dans ce cas la commande /usr/bin/env est couru avec l'argument bash). Ensuite, le script est passé au programme (en tant que second argument) avec tous les arguments que vous avez donnés au script en tant qu'arguments suivants.

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 donc le noyau ne sait pas quel programme utiliser pour l'interpréter. Il 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 il peut ne pas être le bon interpréteur ou il peut en analyser certains avec de subtiles différences comportementales telles que l'affaire entre sh et bash).

Une note sur /usr/bin/env

Le plus souvent, vous verrez des hachages comme ça:

#!/bin/bash

Le résultat est que le noyau exécutera le programme /bin/bash interpréter le script. Malheureusement, bash n'est pas toujours livré par défaut, et il n'est pas toujours disponible /bin. Alors que sur les machines Linux, il est généralement, il existe une gamme d'autres machines POSIX où bash navires dans divers endroits, 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 l'emplacement du bash programme. POSIX dispose déjà d'un mécanisme pour gérer cela: PATH. L'idée est que vous installiez vos programmes dans l'un des répertoires PATH et le système devrait pouvoir trouver votre programme lorsque vous voulez l'exécuter par nom.

Malheureusement, vous ne peux pas faites juste ceci:

#!bash

Le noyau ne fera pas (certains pourraient) faire un PATH recherche pour toi Il y a un programme qui peut faire un PATH recherche pour vous, cependant, il s'appelle env. Heureusement, presque tous les systèmes ont un env programme installé dans /usr/bin. Nous commençons donc env en utilisant un chemin d'accès codé, qui fait alors un PATH rechercher bash et l'exécute pour qu'il puisse 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 comme l'argument de la env programme. Cela signifie que nous n'avons plus de place pour transmettre des arguments à bash. Donc, il n'y a aucun moyen de convertir quelque chose comme #!/bin/bash -exuà ce régime. Vous devrez mettre set -exu après le hashbang à la place.

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 qu'il est buggé ou obsolète, et peut avoir installé son propre bash ailleurs. C’est souvent le cas sur OS X (Mac) où Apple délivre une version obsolète /bin/bash et les utilisateurs installent une mise à jour /usr/local/bin/bash en utilisant quelque chose comme Homebrew. Lorsque vous utilisez le env approche qui fait un PATH recherche, vous prenez en compte les préférences de l'utilisateur et utilisez son bash préféré à celui que son système a livré.


869
2018-04-09 11:58



Pour lancer le script shell 'file.sh':

sh file.sh

bash file.sh

Une autre option est de définir une autorisation d'exécution à l'aide de la commande chmod:

chmod +x file.sh

Maintenant, exécutez le fichier .sh comme suit:

./file.sh

71
2018-04-09 11:39



Pour la coquille de bourne:

sh myscript.sh

Pour bash:

bash myscript.sh

11
2018-04-09 11:39



Si vous souhaitez que le script s'exécute dans le shell actuel (par exemple, si vous voulez qu'il affecte 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 relative, par exemple . bin/script.sh court le script.sh dans le bin répertoire sous le répertoire en cours.


10
2018-04-09 12:42



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

  1. Si le script n'est pas exécutable: -
    Pour exécuter le fichier 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

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


0
2017-08-25 17:29



L'extension de fichier .command est affectée à Terminal.app. Un double-clic sur un fichier .command l'exécutera.


0
2018-03-02 13:11