Introduction
Initialement, nous avons seulement eu un shell unix. Quand a une commande, le shell afin de tenter d'invoquer l'un des exec () sur les appels système. Elle a été la commande d'un exécutable, le exec de réussir et de la commande à exécuter. Si l'exec () a échoué, la coque ne présente pas de place, il serait plutôt tenter d'interpréter le fichier de commandes comme s'il s'agissait d'un script shell. Cela fonctionne bien tant qu'il n'y a qu'un seul shell sur le système. Mais que faire si vous utilisez un shell interactif et que votre voulez exécuter un script shell dans un autre écrit de la langue?
C'est là que la ligne #! truc entre en jeu. L'idée d'utiliser # pour représenter un commentaire provient de csh et a rapidement été ajouté à la bourne shell. Maintenant, tous les obus de savoir à ignorer stuff après un #. On peut donc ajouter une ligne menant à quelque chose comme "#! / Usr / bin / ksh". Pour la coque de cette ligne est juste un commentaire. Mais si le noyau essaie d'exécuter un fichier avec cette ligne, il sera spécifié exec interprète le script et de passer à celle-ci. Ainsi, les scripts shell exécutable devenir un peu comme de véritables exécutables sont. Maintenant, quand un obus cherche à exec un script shell, il réussit.
Que faire si vous laisser sur le #! ligne? Eh bien, le noyau exec échoue. Votre moyen de shell puis essayez d'exécuter le script lui-même. Quelques coquilles va essayer de vérifier le script d'essayer de deviner la langue. Ce n'est pas bon. Vous mai être en cours d'exécution comme ksh shell interactif et à l'écriture de scripts ksh. Si vous passer de bash comme shell interactif, certains de vos scripts mai continue à courir à mai, tandis que d'autres échouent. Aussi la ligne
est un commentaire qui fournit un indice important pour un programmeur qui se penche sur le script de la comprendre. La connaissance de la langue dans laquelle l'auteur est d'essayer de l'utiliser est d'une grande aide.
Si j'ai utilisé le terme "shell", en fait cette technique peut être utilisée avec beaucoup de programmes qui ne sont pas des coquilles. Voici un "script" pour afficher un message multiligne:
Code:
#! /usr/bin/cat
Line 1
Line 2
Line 3
Cela permet d'afficher que "#! / Usr / bin / cat" en ligne, mais d'autres que cela, il fonctionne assez bien.
Passer un argument
Vous pouvez passer d'un seul argument, comme ceci:
#! / usr / local / bin /
perl -w
Mais, en règle générale, vous êtes limité à
un argument. Sur la plupart des systèmes, une ligne: "#! / Un / une interprète-b" se traduira par "-a-b" être passé en un seul argument. Toutefois, le seul argument ne se limite pas à commencer par un tiret. Nous pouvons améliorer notre message sur le script:
Code:
#! /usr/bin/sed 1d
Line 1
Line 2
Line 3
Exemple
Mettons tout cela avec un exemple. Voici une
perl script que je vais appeler perlargs:
Code:
#! /usr/local/bin/perl -w
#! /usr/local/bin/perl -w
print "script name is ", $0, "\n";
while (@ARGV) {
$ARGV = shift @ARGV;
print "argument ", $i++, " is ", $ARGV, "\n";
}
system "ps -f -ww";
La demande-w
perl question des messages d'avertissement. Le script affiche simplement ses arguments, puis exécute la commande ps. Quand je lance, je vous:
Code:
$ ./perlargs one two three
Name "main::i" used only once: possible typo at ./perlargs line 10.
script name is ./perlargs
argument 0 is one
argument 1 is two
argument 2 is three
UID PID PPID STIME TTY TIME CMD
perderabo 69 1 17:47:28 n01 0:00.24 /bin/ksh -l
perderabo 201 69 18:28:22 n01 0:00.03 /usr/local/bin/perl -w ./perlargs one two three
perderabo 2055 201 18:28:22 n01 0:00.01 ps -f -ww
$
Notez que la
perl processus a été appelé avec 5 arguments. Le 2ème argument est le nom du script. Il appartient à la
perl processus de présenter la finale 3 arguments que l'argument de la liste vu par le script. Aussi le noyau a commencé à réaliser la
perl processus. Après cela, il appartient à
perl pour ouvrir le script et de le lire et d'exécuter chaque ligne. C'est pourquoi les scripts doivent être lisibles. Vous ne pouvez pas exécuter un script non-lisible.
Conclusion
Cela devrait être assez d'informations pour comprendre ce qui se passe avec ces #! lignes. Dans les postes ci-après, je vais ajouter des détails sur les divers aspects du processus.