![]() |
Créer un script directement exécutable par le Terminal (niveau débutant). |
L'intérêt d'un script, en général, est de regrouper dans une ligne de commande ou une action simple un ensemble complexe de commandes et d'instructions et d'offrir ainsi un raccourci extrêmement puissant.
Si nous mettons à part le langage d'AppleScript et
nous
concentrons sur le shell (tcsh, bash et autres Zsh) ouvert par le
Terminal, il existe trois manières de programmer des shell
scripts.
a) Pour les plus simples, il suffit de créer des alias de
commande, liant par exemple une ou plusieurs commandes de Terminal et
quelques options (cf. l'exemple dans AvosMac
n°40, p. 40). Mais
cette méthode a l'inconvénient d'oublier les
alias
à la fermeture de chaque session et de nécessiter
la
redéfinition des
alias à chaque nouvelle session du shell.
b) Il est possible également d'écrire et rendre
exécutables des scripts de commandes qui
répondront
à un simple clic de souris. Il suffit alors,
après les
avoir saisis dans un éditeur de texte (TextEdit, par
exemple) de
les enregistrer en substituant le suffixe ".command" au suffixe ".txt"
(cf. AvosMac
n° 28, p.
18, ou Le Meilleur du
Terminal,
p. 46).
c) Nous allons nous intéresser plus
particulièrement
ici à une troisième option: programmer des shell
scripts
un peu plus complexes (en nous limitant toutefois au shell ouvert par
défaut par le Terminal: tcsh),
pouvant contenir
différentes variables, des conditions, des
boucles…, et
exécutables à partir du Terminal comme l'est
n'importe
quelle commande Unix en le plaçant dans le
répertoire
/usr/bin. Ce n'est certes pas la méthode la "plus propre",
mais
c'est
possible. Il est en effet préférable de
créer des
alias permanents en modifiant la configuration du shell. Pour nous
rassurer, souvenons-nous qu'il ne se trouve rien, dans le
répertoire /usr/bin, qui soit important pour le
système.
Nous allons donc voir comment créer un script directement repérable par le Terminal pour être interprété et exécuté comme n'importe quel outil Unix.
Commençons par quelques généralités: parmi les commandes utilisées dans un shell, certaines sont des applications compilées non éditables par un éditeur de texte; d'autres sont au contraire des fichiers textes pouvant être lus, édités et modifiés. Un shell script est un fichier texte destiné à être interprété par le shell. Et le shell, quant à lui, est un programme pouvant être appelé par une commande Unix pour lancer d'autres programmes; mais il posséde également des caractéristiques qui le rendent comparable à un langage de programmation.
Nous allons donc créer un premier script simple (lequel ne présente en soi qu'un intérêt fort limité, puisqu'il pourrait fort bien n'être qu'un simple alias). Quoiqu'il soit plus aisé d'utiliser un éditeur de texte comme pico, nous utiliserons pour cette première étape TextEdit, en veillant toutefois à avoir sélectionné le format texte pur.
Saisissons la ligne suivante en respectant les espaces et la casse:
ls
-al >
~/Desktop/liste.txt
Cette ligne permet de dresser la liste de tous les fichiers et sous-répertoires, y compris cachés (option "-a"), contenus dans un répertoire, ainsi que les droits qui leur sont liés (option "-l"), et d'en rediriger le résultat vers un fichier "liste.txt" qui apparaîtra sur le bureau. Nous l'enregistrons sur le bureau sous le titre "toutlister.sh" (sans les guillemets) et en cliquant, dans la fenêtre de dialogue, sur le bouton "Ne pas ajouter" le suffixe .txt.
A présent, nous ouvrons le Terminal. Nous définissons le bureau comme répertoire de travail:
%
cd Desktop
Puis nous saisissons la ligne suivante:
%
chmod +x
toutlister.sh
Nous pouvons à présent exécuter notre script:
%
./toutlister.sh
Un nouveau fichier "liste.txt" apparaît sur le bureau.
Nous allons ouvrir de nouveau notre fichier et, pour qu'il soit exécuté par le shell tcsh, nous ajoutons la ligne #!/bin/tcsh de manière à avoir ceci:
#!/bin/tcsh
ls -al > ~/Desktop/liste.txt
L'inconvénient de la méthode suivie jusqu'ici, c'est que notre script ne fonctionne qu'avec le bureau comme répertoire courant puisque le Terminal n'en reconnaît pas le Path (chemin d'accès) sans cela.
Pour y remédier, nous allons déplacer notre fichier vers le répertoire /usr/bin/ et le renommer de manière à ce que le shell le reconnaisse quel que soit le répertoire courant.
| Mais
avant de procéder à cette
opération, nous devrons examiner le contenu du
répertoire
/usr/bin/ pour nous assurer qu'il ne contient aucun autre fichier du
même nom que notre script. En effet, dans le cas contraire,
le
fichier natif serait écrasé de manière
irréversible par le nouveau. Le Terminal NE DEMANDE JAMAIS
CONFIRMATION! |
Nous nous rendons dans le
répertoire /usr/bin/:
%
cd /usr/bin
puis nous listons son contenu
%
ls
Cette vérification effectuée, nous pouvons saisir la ligne:
%
sudo mv
~/Desktop/toutlister.sh toutlister
Nous avons ainsi renommé le fichier "toutlister.sh"
en
supprimant le suffixe ".sh" et l'avons placé dans le
répertoire /usr/bin/ où se trouvent un bon nombre
d'autres commandes de Terminal.
devient
ainsi: 
Ouvrons à présent ce répertoire par le menu "Aller" => "Aller au dossier" et saisissons "/usr/bin/". Nous remarquons que le fait d'avoir renommé le fichier sans le suffixe lui a fait prendre l'apparence des autres programmes Unix contenus dans ce répertoire.
Vérifions maintenant l'efficacité de notre script en nous dirigeant, par exemple, dans notre répertoire Départ, ceci en tapant tout simplement:
%
cd
validons puis saisissons cette ligne :
%
toutlister
Le fichier "liste.txt" qui s'affiche sur le bureau contient maintenant tous les fichiers et sous-répertoires de notre répertoire Départ. Il est à présent possible de lister le contenu de n'importe quel répertoire et d'en rediriger le résultat dans un fichier "liste.txt" sur le bureau. Attention cependant à renommer ou déplacer à chaque fois ce fichier, sans quoi il serait irrémédiablement écrasé par toute nouvelle exécution de notre script.
PATH=$PATH:~/bin
export $PATHsetenv
PATH ${PATH}:~/bin