web-dev-qa-db-fra.com

Quelle est la fonction de bash shebang?

  • Quelle est la fonction de bash shebang?
  • Quelle est la différence entre exécuter un fichier à l'aide de ./file ou sh file?
    • Comment Bash le comprend-il?
16
Daniel
  • La fonction de Shebang est:

Les directives d'interpréteur permettent d'utiliser des scripts et des fichiers de données comme des commandes, caché les détails de leur implémentation à partir d'utilisateurs et d'autres programmes, en supprimant la nécessité de préfixer les scripts avec leur interpréteur sur la ligne de commande.

  • Quel est le différent entre exécuter un fichier en utilisant ./file ou fichier sh?

Un script de shell de Bourne identifié par le chemin de chemin/chemin/à/foo, a la ligne initiale,

    #!/bin/sh -x

et est exécuté avec les paramètres Bar et Baz comme

    some/path/to/foo bar baz

fournit un résultat similaire que d'avoir réellement exécuté la ligne de commande suivante à la place:

    /bin/sh -x some/path/to/foo bar baz

Remarque: En 1980, Dennis Ritchie a introduit le support du noyau des directives d'interprète:

The system has been changed so that if a file being executed
begins with the magic characters #! , the rest of the line is understood
to be the name of an interpreter for the executed file.
Previously (and in fact still) the Shell did much of this job;
it automatically executed itself on a text file with executable mode
when the text file's name was typed as a command.
Putting the facility into the system gives the following
benefits.

1) It makes Shell scripts more like real executable files,
because they can be the subject of 'exec.'

2) If you do a 'ps' while such a command is running, its real
name appears instead of 'sh'.
Likewise, accounting is done on the basis of the real name.

3) Shell scripts can be set-user-ID.

Remarque: Linux ignore le bit SetUID sur tous les exécutables interprétés (I.E. Executables commençant par une ligne #!

4) It is simpler to have alternate shells available;
e.g. if you like the Berkeley csh there is no question about
which Shell is to interpret a file.

5) It will allow other interpreters to fit in more smoothly.

Plus d'informations :

11
Yaron

La fonction du hashbang consiste à indiquer au noya quel programme fonctionner comme interprète de script lorsque le fichier est exécuté.

Fonctionnement ./program fait exactement cela et nécessite une autorisation d'exécution sur le fichier, mais est agnostique au type de programme. Ce serait peut-être un script Bash, un script sh, un Perl, Python, Awk ou d'attendre un script, ou un exécutable binaire réel. Fonctionnement sh program le forcerait à être exécuté sous sh, au lieu de toute autre chose.

Notez que sh est différent de bash! Ce dernier a un certain nombre de fonctionnalités avancées non connues par la coque standard. Selon le système, sh peut être un autre programme, ou Bash en mode de compatibilité, mais le résultat est généralement identique: toutes les fonctionnalités avancées sont inaccessibles.

Bash en elle-même ne comprend pas la ligne de hashbang, mais repose sur le noyau pour le lire. D'autre part, l'interprète Perl a également lu la ligne de hashbang par lui-même quelle que soit la manière dont il a été démarré: cela pourra choisir toutes les options de ligne de commande définies sur la ligne HASHBANG. Bash ne fait pas cela.

Par exemple, le script suivant a un comportement différent selon que s'il est démarré comme ./script (via exec et la ligne de hashbang), ou avec bash script (exécution manuellement de l'interprète bash):

#!/bin/bash -u
echo $1
11
ilkkachu

bash lui-même n'attache aucun sens à la ligne Shebang, il ne le voit que comme un commentaire. Lorsque la coquille lit une ligne de commande, la commande est un programme externe (pas une commande interne comme cd), il exécute la commande à l'aide de l'appel système execve. Le noyau examine ensuite quel type d'exécutable le fichier transmis à execve est en cochant le numéro magique au début du fichier. Si le numéro de magie est composé des deux octets 0x23 0x21 (caractères ASCII #!), le noyau suppose qu'ils sont suivis de la voie absolue de l'interprète du script. Le noyau commence alors l'interprète, en passant le script.

5
Johan Myréen

Eh bien, pour être 100% précis, il n'ya pas grand chose à propos d'une "Bash Shebang". Un shebang peut apparaître sous différentes formes. C'est simplement une indication d'interprète. Donc, un shebang de, disons, #!/usr/bin/Perl F.ex.ex. Soyez un "Perl Shebang" et indiquez l'interpréteur Perl comme interprète pour un tel schrupip. Vous pouvez ensuite appeler un tel script Perl comme n'importe quel script shell. Les mêmes représentent tout autre interprète de script. Cela pourrait être php, ou cshell, ou prologue, ou de base ou autre chose qui interprète les fichiers texte d'une manière ou d'une autre. Et bien sûr, l'interprète devrait être capable d'ignorer le shebang. Pour bash, c'est simplement une ligne de commentaire. La même chose est vraie pour php et perl. Je pense que Prologgerait cependant sur cette ligne. Le shebang devrait également fonctionner sans couture avec votre propre application, tant que cela est capable d'interpréter le texte et d'ignorer le shebang.

Ce serait intéressant si f.ex. Un interprète JavaScript serait capable d'ignorer un tel "JavaScript Shebang" :)

1
Siegfried