Pour aller plus loin...
Exploitation avancée des arguments
Bien qu’il soit plus simple de se contenter d’arguments fixes ordonnés, on peut vouloir développer un script plus flexible, surtout s’il est amené à être utilisé par d’autres personnes. Dans ce cas, il peut être utile de proposer des arguments et options, à l’image de ce que l’on trouve avec d’autres commandes.
Deux commandes peuvent remplir ce rôle :
-
getopt, une commande externe non normalisée, qui a l’avantage de supporter les options longues sous Linux, mais dont le fonctionnement n’est pas identique sur tous les UNIX - notamment, certaines implémentations ne supportent pas les arguments contenant des espaces.
-
getopts, une commande du shell normalisée POSIX qui a l’inconvénient de ne pas supporter les options longues, mais qui fonctionne de la même manière sur tous les systèmes UNIX compatibles POSIX.
Cette section abordera la commande getopts en raison de sa compatibilité POSIX. Celle-ci propose les fonctionnalités suivantes :
-
Les options inconnues sont ignorées (avec affichage d’un message d’erreur).
-
Les options combinées (« -ab » sont interprétées comme si elles étaient séparées (« -a -b »).
-
Chaque option peut nécessiter un argument....
Formatage des sorties
1. Couleurs
Les terminaux sont capables d’afficher des messages en couleur. Pour cela, ils interprètent des séquences de données (appelées « séquences d’échappement », « codes d’échappement »), normalisées par l’ANSI dans les années 1970 (aujourd’hui fusionnée avec l’ancienne norme européenne équivalente dans la norme ISO 6429) - ces séquences sont supportées par la plupart des émulateurs de terminaux, y compris la console de Windows 10 depuis 2015.
Ces séquences commencent par le caractère d’échappement (code ASCII 27 - ce nombre est noté 33 en octal, cette valeur sera rencontrée plus bas), suivi d’un ou plusieurs caractères. La plupart du temps, le premier de ces caractères est un crochet ouvrant « [ » ; on note alors ces deux caractères « ESC[ », cet ensemble de caractères est appelé introducteur de contrôle de séquence, Control Sequence Introducer (CSI) en anglais. Ce CSI est alors suivi de différents codes de contrôle. Enfin, parmi ces codes de contrôle, ceux qui terminent par la lettre « m » sont appelés Select Graphic Rendition, paramètres de rendu graphique. Ceux-ci sont définis par un ou plusieurs numéros, séparés par des points-virgules si nécessaire.
Les autres séquences de contrôle peuvent concerner par exemple le déplacement du curseur, son affichage, le défilement de l’écran... Il existe également des séquences de contrôle utilisant d’autres préfixes que le CSI, permettant par exemple de changer le titre de la fenêtre de terminal.
Insertion dans un script
Parmi la séquence de caractères évoquée, le seul caractère problématique est le caractère d’échappement. Pour celui-ci, on utilise un autre concept, également appelé séquence d’échappement (autrement dit, on échappe avec une séquence d’échappement shell le premier caractère d’une séquence d’échappement ANSI...
Droits avancés avec les ACL POSIX
Lorsque les droits basiques (utilisateur, groupe, autre) ne suffisent pas, il peut devenir nécessaire d’utiliser les ACL POSIX. Pour cela, il est parfois nécessaire de les activer sur le système de fichiers, ce qui se fait en ajoutant l’option acl lorsqu’il est monté (avec l’argument -o à la commande mount ou dans le quatrième champ dans le fichier fstab). Cette option est supportée au moins par les systèmes de fichiers ext2, ext3, ext4, reiserfs et btrfs. Notons cependant que cette option peut être activée par défaut, notamment sur les versions récentes des systèmes.
Une fois celle-ci activée, les commandes getfacl et setfacl peuvent être utilisées pour manipuler ces droits avancés, qui sont associés à des utilisateurs ou des groupes précis (en complément de l’utilisateur et du groupe propriétaires). Les droits concernés restent r (lecture), w (écriture) et x (exécution).
Ajouter ou supprimer des droits
La commande setfacl utilisée avec son option -m (ou --modify) permet de modifier les droits sur un ou plusieurs fichiers. Elle prend alors comme argument une liste de droits, séparés par des espaces, ayant ce format :
<type>:<nom>:<permissions>
… où :
-
<type> est égal...
Réseau
Les commandes abordées dans ce chapitre ne sont pas nécessairement normalisées par POSIX et pourront différer selon les systèmes. Elles sont à utiliser avec précaution.
1. Bas niveau, configuration, diagnostic
ifconfig et ip
La commande ifconfig est une commande historique, permettant d’obtenir la liste des interfaces réseau et leurs adresses IP. Elle accepte notamment deux arguments intéressants :
-
Avec l’option -a, elle liste toutes les interfaces, même celles qui ne sont pas en fonction (sans cette option, seules les interfaces « up » sont affichées).
-
Avec le nom d’une interface en argument, elle n’affiche que cette interface.
Attention, selon les systèmes cette commande est susceptible de retourner des informations traduites. Pour s’assurer que le texte soit en anglais (et assurer le bon fonctionnement à un script), il peut être utile de faire précéder la commande par LANG=C.
Exemple (certaines lignes sont tronquées) :
$ LANG=C ifconfig wlp3s0
wlp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.42.14 netmask 255.255.255.0 broadcast 192.1
inet6 fe80::68db:f44f:f535:2ad2 prefixlen 64 scopeid 0x20
ether 9c:4e:36:c6:d0:b0 txqueuelen 1000 (Ethernet)
RX packets 2307449 bytes 1795267741 (1.7 GB)
RX errors 0 dropped 17 overruns 0 frame 0
TX packets 1608467 bytes 318486211 (318.4 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
La commande ip, quant à elle, permet d’obtenir les mêmes informations avec son argument address (que l’on peut raccourcir en « addr »). Cette, commande, plus récente, accepte également d’autres arguments, comme route (pour obtenir la table de routage).
Cependant, celle-ci n’affiche pas, par défaut, les statistiques (nombre de paquets traversant les interfaces, etc.). Pour cela, il faut faire précéder l’argument de l’option -s (ou --statistics).
Exemple (ici aussi, certaines lignes sont tronquées) :...
Impression et numérisation
1. Impression
Sous Linux, les impressions sont gérées par le logiciel CUPS (« Common Unix Printing System »), que l’on retrouve également sur OS X. La société Easy Software Products, où a été inventé ce logiciel, a été rachetée par Apple en 2007 et son développeur d’origine est employé afin d’assurer le maintien et le développement de ce système.
Son administration peut se faire dans son interface web (sur le port 631), mais dans le cadre d’un script il est préférable de s’appuyer sur ses commandes.
CUPS propose des commandes compatibles avec les deux systèmes d’impression historiques : lp (provenant d’Unix System V) et lpr (provenant de BSD). Par souci de simplicité, cette section se concentrera sur les commandes venant d’Unix System V.
L’exécution d’une impression se fait avec la commande lp, prenant comme simple argument le nom du fichier à imprimer. CUPS supporte différents types de fichiers : texte pur, PostScript, PDF, images...
Le tableau ci-après présente certaines des options acceptées par la commande lp :
Option |
Objectif |
-d <nom> |
Imprimer sur l’imprimante nommée au lieu de l’imprimante par défaut. |
-n <nombre> |
Imprimer... |
Médias
1. Images
La collection d’outils ImageMagick, non incluse dans la norme POSIX, a pour objectif de manipuler des images. La dernière version de ImageMagick (version 7) propose la commande magick, cependant en 2017 cette version n’est pas encore très répandue ; les versions précédentes reposent sur plusieurs commandes :
-
convert pour transformer des images (redimensionnement, découpage, flou, changement de format...).
-
mogrify pour modifier des images en écrasant le fichier d’origine.
-
display pour afficher des images.
-
montage pour combiner des images.
Ces commandes supportent plus de 200 formats de fichiers, dont PNG, JPEG, GIF, TIFF, SVG, PostScript, PDF. Parmi celles-ci, la commande utilisée le plus souvent est convert, qui peut être mise en œuvre pour changer le format de fichiers, redimensionner des images, etc.
Des livres entiers existent pour expliquer le fonctionnement de ces commandes, celles-ci ne peuvent pas être présentées en détail ici. Le tableau suivant présente toutefois quelques options basiques pouvant être utilisées avec cette commande, ces options pouvant être combinées.
Option |
Objectif |
Sans option |
Changer le format du fichier. |
-resize <valeur>% |
Redimensionner l’image à ce pourcentage de l’originale. |
-resize <largeur> |
Redimensionner l’image pour qu’elle ait cette largeur en pixels. |
-resize x<hauteur> |
Redimensionner l’image pour qu’elle ait cette hauteur en pixels. |
-resize <largeur>x<hauteur> |
Redimensionner l’image pour qu’elle ait au maximum cette largeur et cette hauteur en pixels (le rapport entre largeur et hauteur est conservé). |
-thumbnail <valeur> |
Créer une vignette pour l’image (cette option accepte les mêmes valeurs que -resize) - plus adaptée que resize, cette commande effectue la miniaturisation plus rapidement, c’est utile lorsque l’on traite de nombreuses images. |
-quality <valeur> |
Changer le niveau de compression de l’image (pour les formats JPEG ou PNG notamment). |
-flip |
Retourner l’image selon un axe horizontal. |
-flop |
Retourner l’image selon un axe vertical. |
-rotate <valeur> |
Effectuer une rotation (la valeur est en degrés). |
-background <couleur> |
Ajouter une couleur de fond (utile avec... |
Environnements de bureau
Lorsque des postes de travail sont installés sous Linux, il est possible d’en gérer de nombreux aspects de manière automatisée, notamment par le biais de scripts. Cela peut concerner des parcs de postes en entreprises, mais également des postes en libre-service (« bornes internet »). Il est possible d’influencer les paramètres des environnements par le biais de fichiers de configuration ou par certains outils, dédiés à chacun des environnements. Certaines de ces méthodes sont évoquées ici, les détails peuvent être trouvés dans les pages de manuel de chacune des commandes abordées.
Fichiers de configuration
De manière générale, les configurations des environnements se situent dans les répertoires de chacun des utilisateurs, sous forme de fichiers cachés (dont le nom commence par un point) ou dans le répertoire .config.
On peut alors préconfigurer un ou plusieurs environnements de bureau en plaçant les configurations souhaitées dans le répertoire /etc/skel : le contenu de celui-ci étant utilisé comme modèle pour la création du répertoire personnel d’un nouvel utilisateur, ce dernier aura alors la configuration mentionnée.
Un script peut également directement modifier les fichiers...
Autres langages
Au-delà d’un certain niveau de complexité, il peut être souhaitable de remplacer un script shell par un programme écrit dans un autre langage, afin de profiter de fonctionnalités et de performances plus poussées que ce qui est possible avec un script shell.
Parmi ces langages, on retrouvera le plus souvent Perl et Python. Plus rarement, on pourra rencontrer des scripts dans les langages Ruby, PHP : le choix du langage dépend principalement des connaissances de la personne qui est en charge de son écriture. Toutefois, il s’agit la plupart du temps de langages interprétés, permettant de modifier très rapidement le code source lorsque le besoin se fait ressentir : on ne rencontre généralement pas d’outils de ce genre dans les langages C, Java, Go, etc.
Avantages
On choisit généralement de changer de langage afin de profiter de leurs fonctionnalités, qu’elles soient liées au fonctionnement ou à la syntaxe du langage lui-même (possibilités de stockage, comparaison, tri, calculs avancés sur les données) ou aux bibliothèques qui l’accompagnent (lorsqu’il est nécessaire de traiter des données dans certains formats, comme le XML, les bibliothèques de ces langages s’avèrent particulièrement efficaces).
Il peut également...