logo


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.

toutlisterA      devient ainsi:    toutlisterB

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.


Au lieu de placer le script dans /usr/bin, il est cependant préférable de le mettre dans /usr/local/bin/ pour tous les utilisateurs, ou dans le répertoire ~/bin/ que l'on crée dans son répertoire personnel. Dans ce dernier cas, il faudra ajouter au fichier ~/.profile (pour bash) ou~/.zshrc (pour zsh) les lignes suivantes :

PATH=$PATH:~/bin
export $PATH


Pour ceux qui utilisent le shell tcsh, ajouter au fichier ~/.tcshrc :

setenv PATH ${PATH}:~/bin

Relancer ensuite le Terminal, et tous les exécutables compris dans le répertoire ~/bin seront reconnus par le shell.

Pour me contacter, vous pouvez m'écrire à