GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi avez-vous besoin de mettre #!/bin/bash au début d'un fichier de script ?

C'est une convention pour que le shell *nix sache quel type d'interpréteur exécuter.

Par exemple, les versions plus anciennes d'ATT étaient par défaut sh (le shell Bourne), alors que les anciennes versions de BSD étaient par défaut csh (le shell C).

Même aujourd'hui (où la plupart des systèmes exécutent bash, le "Bourne Again Shell" ), les scripts peuvent être en bash, python, perl, ruby, PHP, etc, etc. Par exemple, vous pouvez voir #!/bin/perl ou #!/bin/perl5 .

PS :Le point d'exclamation (! ) est affectueusement appelé "bang" . Le symbole de commentaire du shell (# ) est parfois appelé "hachage" .

PPS :Rappelez-vous - sous *nix, associer un suffixe à un type de fichier n'est qu'une convention , pas une "règle" . Un exécutable peut être un programme binaire, n'importe lequel d'un million de types de scripts et d'autres choses également. D'où la nécessité de #!/bin/bash .


Pour être plus précis le shebang #! , lorsqu'il s'agit des deux premiers octets d'un exécutable (x mode), est interprété par l'appel système execve(2) (qui exécute des programmes). Mais spécification POSIX pour execve ne mentionnez pas le shebang.

Il doit être suivi d'un chemin de fichier d'un exécutable d'interpréteur (qui BTW pourrait même être relatif, mais le plus souvent absolu).

Une bonne astuce (ou peut-être pas si bonne) pour trouver un interpréteur (par exemple python ) dans le $PATH de l'utilisateur est d'utiliser le env programme (toujours à /usr/bin/env sur tous les Linux) comme par exemple

 #!/usr/bin/env python

Tout exécutable ELF peut être un interpréteur. Vous pouvez même utiliser #!/bin/cat ou #!/bin/true si tu voulais ! (mais ce serait souvent inutile)


Ça s'appelle un shebang. En langage Unix, # est appelé sharp (comme dans la musique) ou hash (comme les hashtags sur Twitter), et ! s'appelle bang. (Vous pouvez en fait référencer votre commande shell précédente avec !!, appelée bang-bang). Ainsi, une fois assemblés, vous obtenez du haSH-BANG, ou du shebang.

La partie après le # ! indique à Unix quel programme utiliser pour l'exécuter. S'il n'est pas spécifié, il essaiera avec bash (ou sh, ou zsh, ou quelle que soit votre variable $SHELL) mais s'il est là, il utilisera ce programme. De plus, # est un commentaire dans la plupart des langues, donc la ligne est ignorée lors de l'exécution suivante.


Linux
  1. Pourquoi une variable est-elle visible dans un sous-shell ?

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

  3. Pourquoi /bin/sh pointe-t-il vers /bin/dash et non /bin/bash ? ?

  4. Comment connaître le nom du fichier de script dans un script Bash ?

  5. Comment inclure un fichier dans un script shell bash

Script Bash pour supprimer le fichier le plus ancien d'un dossier ?

Pourquoi personne n'utilise le True Bourne Shell comme /bin/sh ?

Aucune raison d'avoir un Shebang pointant vers /bin/sh plutôt que /bin/bash ?

Quelles tailles devez-vous allouer à /, /boot, /home et swap

Quand dois-je utiliser #!/bin/bash et quand #!/bin/sh ?

chroot échoue - impossible d'exécuter la commande `/bin/bash' :aucun fichier ou répertoire de ce type