GNU/Linux >> Tutoriels Linux >  >> Linux

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

Pour lancer le shell-script 'file.sh' :

sh file.sh

bash file.sh

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

chmod +x file.sh

Exécutez maintenant le fichier .sh comme suit :

./file.sh

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

sh myscript

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

bash myscript

Pour démarrer un 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, donnez-lui la permission nécessaire :

chmod +x bar
./bar

Lorsqu'un fichier est exécutable, le noyau est chargé de déterminer comment l'exécuter. Pour les non-binaires, cela se fait en regardant la première ligne du fichier. Il doit 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 exécuté avec l'argument bash ). Ensuite, le script est passé au programme (comme deuxième argument) avec tous les arguments que vous avez donnés au script comme arguments suivants.

Cela signifie que chaque script exécutable doit 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. Cela 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 du tout le bon interpréteur ou il peut être capable d'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 des hachages comme ceci :

#!/bin/bash

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

Pour écrire un script bash portable, on ne peut donc pas compter sur le codage en dur de l'emplacement du bash programme. POSIX a déjà un mécanisme pour gérer cela :PATH . L'idée est que vous installiez vos programmes dans l'un des répertoires qui se trouvent dans PATH et le système devrait pouvoir trouver votre programme lorsque vous souhaitez l'exécuter par son nom.

Malheureusement, vous ne pouvez pas fais juste ceci :

#!bash

Le noyau ne fera pas (certains pourraient) faire un PATH te chercher. Il existe un programme qui peut faire un PATH chercher pour vous, cependant, il s'appelle env . Heureusement, presque tous les systèmes ont un env programme installé dans /usr/bin . Alors on commence env en utilisant un chemin codé en dur, qui fait ensuite 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 argument du env programme. Cela signifie que nous n'avons plus d'espace pour passer des arguments à bash . Il n'y a donc aucun moyen de convertir quelque chose comme #!/bin/bash -exu à ce régime. Il faudra 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, trouver qu'il est bogué ou obsolète, et peut avoir installé son propre bash ailleurs. C'est souvent le cas sur OS X (Mac) où Apple fournit un /bin/bash obsolète et les utilisateurs installent un /usr/local/bin/bash à jour en utilisant quelque chose comme Homebrew. Lorsque vous utilisez le env approche qui fait un PATH recherche, vous tenez compte des préférences de l'utilisateur et utilisez son bash préféré par rapport à celui fourni avec son système.


Pour le coquillage :

sh myscript.sh

Pour bash :

bash myscript.sh

Linux
  1. Comment résoudre un nom d'hôte en adresse IP dans un script bash ?

  2. Comment arrêter le script Loop Bash dans le terminal ?

  3. Comment vérifier la sous-chaîne dans Shell Script Bash?

  4. Comment exécutez-vous un script lors de la connexion dans * nix ?

  5. Comment inclure un fichier dans un script shell bash

Comment exécuter un script bash {7 méthodes}

Comment exécuter une commande / un script Linux Shell en arrière-plan

Comment exécuter un script Shell en tant que service SystemD sous Linux

Comment exécuter un script bash

Comment créer et exécuter un script shell dans Ubuntu 22.04

Comment détecter la disponibilité de l'interface graphique dans Bash/Shell ?