Aller au menu - Aller au contenu

Icône Vos premiers scripts

Avatar
Mise à jour : 04/08/2011
Difficulté : Facile Facile Creative Commons BY-NC-SA
7 018 visites depuis 7 jours, dont 147 sur ce chapitre classé 32/786
Je vous ai parlé à plusieurs reprises du csh depuis le début de ce tutoriel. Le csh est un shell. Autrement dit, c'est à la fois :

  • Un langage de programmation, grâce auquel vous donnez des instructions à l'ordinateur.
  • Un interpréteur, c'est à dire un programme qui traduit le langage ci-dessus, compréhensible par les humains, en langage machine, compréhensible par l'ordinateur.

Un langage de programmation ? Comme le C et le Java ?

Pas tout à fait comme eux, non. D'abord, c'est un langage interprété, alors que C et Java sont ce qu'on appelle des langages compilés. Il n'y a pas, d'un côté, un fichier source et, de l'autre, un fichier binaire exécutable. Les instructions en shell sont lues une par une et traduites aussitôt en suites de 0 et de 1, que l'ordinateur exécute dans la foulée, avant même de lire l'instruction suivante.

Ensuite, c'est un langage spécialisé, qui sert à enchaîner des commandes UNIX, en utilisant éventuellement des variables et des conditions, comme vous allez le voir. On dit donc que les shells sont des langages de scripts.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

A - bonjour.csh

Il existe plusieurs types de shells. Voici les principaux :
  • Le Bourne Shell (sh), développé par Steve Bourne (AT&T) et sorti en 1977.
  • Le C shell (notre cher csh), développé par Bill Joy (Université de Berkeley) et sorti en 1978.
  • Le Tenex C shell (tcsh), développé par Ken Greer (Carnegie Mellon University) entre 1975 et 1981.
  • Le Korn Shell (ksh), développé par David Korn (AT&T) et sorti en 1983.
  • Le "Bourne Again SHell" (bash), développé par Brian Fox (Free Software Foundation) et sorti en 1989. Ce nom est un jeu de mots avec born again (résurrection). ;)
Le tcsh et le csh ont vite évolué l'un vers l'autre et sont aujourd'hui identiques. La seule différence est que vous pouvez donner une configuration différente à chacun. Chaque fois que je parle du csh, cela s'applique donc aussi bien au tcsh.

Sous FreeBSD, on utilise généralement le csh, inspiré du langage C. D'autres UNIX font plutôt appel au ksh. Et du côté de Linux, vous rencontrerez le bash, le shell du projet GNU. Vous pouvez en découvrir beaucoup d'autres dans le dossier /usr/ports/shells/ : ch, cwish, dash, esh (inspiré du langage Lisp), fish, zsh, etc.

C'est le (t)csh que je vais vous présenter ici. Et je m'en voudrais de déroger à la grande tradition du "Bonjour !" En effet, quand on apprend un nouveau langage de programmation, on commence bien souvent par écrire un petit programme tout simple, qui affiche juste "Bonjour !" :)

C'est parti !

Ouvrez emacs (ou un autre éditeur de texte) et créez un nouveau fichier bonjour.csh. Vous connaissez déjà la commande pour afficher du texte : echo. Votre script n'a donc besoin que d'une seule ligne :

Code : Bash
1
echo 'Bonjour !'


Inutile de numéroter les lignes.


Tout au long de cette Partie 5, vous allez lire des scripts comme celui-ci. En haut, il est indiqué Code : Bash. Attention : ces scripts ne sont PAS écrits en bash. Ils sont en csh (ou en ksh pour ceux du dernier chapitre). Mais comme il n'existe pas encore de fenêtres Code : csh ou Code : ksh sur le Site du Zéro (bientôt, peut-être), j'ai dû faire comme ça. J'espère que ça ne vous embrouillera pas. :honte:


Sauvegardez, ouvrez une console, et allez dans le dossier où se trouve votre fichier bonjour.csh. Pour demander l'exécution du script, tapez csh, puis le nom du fichier :

Code : Console
% csh bonjour.csh
Bonjour !


Ha ha, ça marche... :D

Vous pouvez aussi exécuter le script directement. Il se trouve dans le dossier . (le dossier courant). Il faut donc taper :

Code : Console
% ./bonjour.csh


Permission denied.

Comment ? Nous n'avons pas le droit d'exécuter le script ? Vérifions ça. Nous avons déjà parlé des droits, quand je vous ai présenté la commande ls -l. Rafraichissons-nous la mémoire en appelant à nouveau cette commande :

Code : Console
% ls -l


Vous obtenez alors la liste des fichiers du dossier courant, avec des informations pour chacun. Par exemple :

Code : Console
-rw-r--r--   1 brice  brice        71 May 14 13:56 bonjour.csh
-rw-r--r--   1 brice  brice     13814 May 30 18:22 dauphin.png
-rw-r--r--   1 brice  brice   3905131 May 14 22:26 debugging.mp4
-rw-r--r--   1 brice  brice  62778916 Apr 27 16:39 diablo-caffe-freebsd7-amd64-1.6.0_07-b02.tar.bz2
-rw-r--r--   1 brice  brice      1516 May 11 11:24 electrocardiogramme.png
-rw-r--r--   1 brice  brice      4556 May 15 15:13 exemple1.png
-rw-r--r--   1 root   brice   1049780 Apr 25 21:51 feh.png
-rw-r--r--   1 brice  brice  29216340 May 14 14:44 gcc-4.7-20110507.tar.xz
-rw-------   1 brice  brice  67100672 May 21 17:15 gcompris.core
-rw-r--r--   1 brice  brice        70 May 14 14:41 fullo.f
-rw-r--r--   1 brice  brice     14482 May  9 19:11 liste des commandes freebsd.odt
-rw-------   1 brice  brice  73310208 May 21 22:21 lxpanel.core
-rw-r--r--   1 brice  brice     10975 Jun  7 12:14 notes 2nd1.ods
-rw-r--r--   1 brice  brice     11658 Jun  7 12:14 notes 2nd2.ods


S'il y a beaucoup de fichiers dans le dossier, cela peut être compliqué de s'y retrouver. Là, nous avons de la chance car bonjour.csh est le premier fichier de la liste. Mais ce ne sera pas toujours comme ça. Pour ne voir que le fichier qui nous intéresse, on indique son nom :

Code : Console
% ls -l bonjour.csh
-rw-r--r--   1 brice  brice        71 May 14 13:56 bonjour.csh


Citation : Chapitre ''Premier coup d'oeil''
Les caractères à gauche indiquent qui a le droit de faire quoi dans chaque fichier ou dossier. Les caractères 2, 3 et 4 indiquent les droits de lecture, d'écriture et d'exécution du propriétaire. Les 3 caractères suivants montrent les droits du groupe propriétaire et les trois derniers les droits des autres utilisateurs.
  • r : droit de lire le fichier
  • w : droit de modifier le fichier
  • x : droit d'exécuter le fichier
Dans le cas de bonjour.csh, son propriétaire (vous) a le droit de le lire et de le modifier mais pas celui de l'exécuter. Voilà pourquoi vous avez reçu le message Permission denied quand vous avez demandé son exécution. Les autres membres de votre groupe (à priori, personne : il n'y a que vous dans ce groupe) n'ont que le droit de lire le fichier, tout comme le reste des utilisateurs.

Pour pouvoir exécuter directement le script, il faut donc modifier ses droits d'accès. C'est le travail de la commande chmod. Pour chaque type d'utilisateur (propriétaire/groupe/autres) il faut indiquer le mode que vous voulez donner au fichier. C'est un nombre compris entre 0 et 7 :
  • 0 : Aucun droit d'accès.
  • 1 : Droit d'exécution.
  • 2 : Droit de modification.
  • 3 (1+2) : Droit d'exécution et de modification.
  • 4 : Droit de lecture.
  • 5 (1+4) : Droit d'exécution et de lecture.
  • 6 (2+4) : Droit de modification de lecture.
  • 7 (1+2+4) : Droit d'exécution, de modification et de lecture.

Imaginons que nous voulions donner tous les droits au propriétaire (mode n°7), les droits d'exécution et de lecture aux autres membres du groupe (mode n°5) et uniquement les droits d'exécution au reste du monde (mode n°1). Il faut donc écrire :

Code : Console
% chmod 751 bonjour.csh


Vérifions qu'il n'y a pas d'erreur :

Code : Console
% ls -l bonjour.csh
-rwxr-x--x   1 brice  brice        71 May 14 13:56 bonjour.csh

C'est bien ce qu'on voulait. :)

Maintenant, vous avez le droit d'exécuter votre script :

Code : Console
% ./bonjour.csh
Bonjour !


On peut encore simplifier cette commande. Avez-vous suivi mes conseils et ajouté le dossier . dans la variable d'environnement PATH ? Si ce n'est pas le cas, il est encore temps de le faire :

Code : Console
% setenv PATH $PATH:.


Ajoutez cette même ligne au fichier /etc/csh.cshrc ou, au moins, à votre .cshrc personnel pour enregistrer ce changement de manière permanente.

Le dossier courant fait maintenant partie de ceux que FreeBSD explore automatiquement quand vous tapez une commande. Donc vous n'avez qu'à écrire :

Code : Console
% bonjour.csh
Bonjour !


Difficile de faire plus simple, n'est-ce pas ? Et pourtant, on peut encore... En effet, le suffixe .csh dans le nom du fichier n'a rien d'indispensable. C'est une convention pour reconnaître facilement un script csh. Mais si vous comptez l'utiliser souvent, il est plus utile de faire court.

Code : Console
% cp bonjour.csh bonjour
% rm bonjour.csh


Votre fichier de script s'appelle maintenant bonjour. Et pour l'exécuter, vous n'avez plus qu'à taper :

Code : Console
% bonjour
Bonjour !


Ce programme bonjour n'est accessible directement que si vous êtes dans le même dossier que lui. Sinon, il faut indiquer son chemin d'accès, comme vous en avez l'habitude. Par exemple : ~/bonjour, s'il est dans votre dossier personnel. Pour pouvoir y accéder directement depuis n'importe quel dossier, il faut le copier dans /usr/local/bin/.

B - Interaction avec l'utilisateur

Naturellement, ça ne vaut pas le coup d'écrire un script qui ne fait que ça. Essayons plutôt d'intéragir avec l'utilisateur, en lui demandant de saisir quelque chose.

Demandez à votre éditeur de texte préféré de créer un nouveau fichier, que nous appellerons saisie.

Code : Bash
1
2
3
echo "Saisissez un mot ou un nombre :"
set reponse=$<
echo 'Vous avez saisi : '$reponse

Je vous rappelle que la commande echo peut s'employer indistinctement avec des apostrophes ' ' ou avec des guillemets " ".


Evitez les accents et autres caractères franco-français. Ils risquent de ne pas s'afficher correctement.

Avec la commande set, nous avons créé une variable reponse. Quelque part dans la mémoire de l'ordinateur, à un endroit choisi par FreeBSD, une sorte de "boîte" est apparue. Sur le couvercle, il y a écrit "reponse". Dans cette boîte, on peut mettre ce qu'on veut : un nombre, une lettre ou même un mot. Et ce contenu pourra éventuellement varier au cours de l'exécution du script. D'où le nom de variable, utilisé pour désigner ce genre de boîte.

Le contenu de la boîte est appelé valeur de la variable. Le plus simple, pour affecter un contenu à une variable, c'est d'écrire quelque chose du genre :

Code : Bash
1
set a = 17


La variable a vaut alors 17. On a rangé le nombre 17 dans la boîte marquée a.

Ici, toutefois, c'est un peu plus compliqué. Au moment d'écrire le script, on ne sait pas quelle valeur sera affectée la variable reponse. C'est l'utilisateur qui entrera ce qu'il veut pendant l'exécution. On utilise donc un code spécial : $<. Il signifie "ce que l'utilisateur rentre au clavier". Quoi qu'il tape, ce sera stocké dans la variable reponse.

Si l'utilisateur tape plusieurs mots, seul le premier sera enregistré dans la variable.


La troisième ligne du script affiche $reponse, c'est à dire le contenu de la variable reponse.

Essayez avec la commande csh :

Code : Console
% csh saisie
Saisissez un mot ou un nombre :

Tapez quelque chose et finissez par la touche Entrée.

Code : Console
% csh saisie
Saisissez un mot ou un nombre :
turlututu chapeau pointu
Vous avez saisi : turlututu


Essayez maintenant d'exécuter le même script en l'appelant directement :

Code : Console
% saisie
Saisissez un mot ou un nombre :
saisie: 2: Syntax error: newline unexpected

Une erreur ? Mais il n'y en avait pas tout à l'heure ! J'ai modifié le script sans m'en apercevoir ?

Vous savez bien que non. C'est le même script qui fonctionnait bien avec la commande csh et qui dénonce maintenant une erreur à la ligne 2.

Remarquez d'abord que la ligne 1 s'est exécutée normalement. csh est un langage interprété. C'est donc seulement après avoir exécuté la ligne 1 qu'il lit la ligne 2 et y remarque une erreur.

Pourtant, il n'y a pas d'erreur à la ligne 2. Vous avez vu que tout va très bien avec la commande csh. Quel est le problème, ici ?

Le problème, c'est que, sans la commande csh, UNIX ne sait pas dans quel langage est écrit votre script. Par défaut, il croit que c'est du sh, du Bourne shell. La ligne 1 ne pose aucun soucis car la syntaxe est la même en sh et en csh. Mais, à la ligne 2, ça coince. Remarquez que, même si vous finissez votre nom de fichier par .csh, cela ne change rien.

On est donc obligé d'appeler le script avec la commande csh, c'est ça ?

Non, il y a une autre solution. Il faut écrire au début du script quel est le langage utilisé et où se trouve le programme interpréteur. Pour le csh, ce programme est /bin/csh.

Votre script devient :

Code : Bash
1
2
3
4
5
#!/bin/csh

echo "Saisissez un mot ou un nombre :"
set reponse=$<
echo 'Vous avez saisi : '$reponse


Et maintenant, ça marche :) :

Code : Console
% saisie
Saisissez un mot ou un nombre :
456
Vous avez saisi : 456



Chapitre précédent Sommaire Chapitre suivant

Partager

1 commentaire pour "Vos premiers scripts"
Note moyenne : 3.71 / 4 (299 votes)
Pseudo Commentaire
Hors ligne robin850 # Posté le 29/06/2011 à 19:52:31
Avatar

Ville : Avesnes-sur-helpe
Pays : France métropolitaine

Salut,

déjà ton tutoriel à la base est génial mais voir un des chapitres sur le csh et le ksh, je trouve ça vraiment super ! :) Merci beaucoup de partager tes connaissances avec nous, j'adore vraiment ta façon de rédiger les cours.

Pardonnez mes fautes d'orthographe.
Image utilisateur


Utilisation de Twig, un moteur de Templates
 

Voir tous les commentaires