Ceci est le troisième article d'une série axée sur les scripts Gnu Bash. Sur le premier article, nous venons de créer un script simple avec des commandes, les unes après les autres. Nous avons également vu certaines variables utilisées.
Le deuxième article couvrait certaines structures de contrôle bash. Celui-ci couvrira les redirections, les canaux et la substitution de commandes.
Le bon vieux temps
Au départ, il y avait un principe :un outil devait faire une chose et le faire bien. Il appartenait à l'utilisateur de combiner ces outils afin d'obtenir les résultats souhaités.
Maintenant, nous (admettez-le :parfois vous aussi, vous pourriez vous sentir perdu sans interface graphique) faisons (presque) tout avec une souris. Mais la ligne de commande est toujours là et d'autres fois pour écrire des commandes ou un script, c'est plus facile que de cliquer sur chaque élément de l'écran.
Redirection
Nous pouvons rediriger l'entrée ou la sortie d'une commande avant qu'elle ne soit exécutée. Nous pouvons utiliser cette redirection pour stocker la sortie d'une commande dans un fichier. Ou nous pouvons utiliser la redirection d'entrée pour lire certaines données d'un fichier.
Par exemple, si nous voulons stocker l'état actuel (c'est-à-dire ls -l) d'un dossier dans un fichier texte pour comparer les modifications ultérieurement, nous utilisons le > opérateur comme celui-ci :
ls -l > status.txt
Cela redirigera la sortie standard de ls -l dans un fichier nommé status.txt. Si status.txt existe déjà, sera écrasé. Pour ajouter la sortie standard à un fichier existant, utilisez >> opérateur.
Pour rediriger l'entrée standard vers une commande, utilisez le < opérateur. Par exemple :
mysql somedb < file.sql
Pour rediriger l'erreur standard vers un fichier, ajoutez le descripteur de fichier 2 (le descripteur de fichier 1 est la sortie standard (stdout), 0 est pour l'entrée (stdin)) à la redirection :
commande 2> fichier
Faites attention à ce qu'il n'y ait pas d'espace entre le numéro du descripteur de fichier et l'opérateur. S'il y avait un espace entre eux, ce "2" devient un paramètre. Par exemple :
La première commande est "ls (fichier) quelque chose ” et redirigez la sortie d'erreur vers status.txt. Dans la deuxième commande, nous voyons l'erreur de notre première commande :le fichier nommé quelque chose est introuvable.
La troisième commande est ls fichiers quelque chose et 2 (aucun d'entre eux n'existe) et redirige la sortie standard vers status.txt. Les erreurs (fichier introuvable) sont imprimées à l'écran et dans la quatrième commande, nous voyons que status.txt a été laissé vide car il n'y a pas de fichiers nommés "2" ou "quelque chose".
Nous pouvons combiner des redirections, comme envoyer stdout et stderr vers un fichier, mais l'ordre des redirections est important. Par exemple :
D'après le manuel bash :les premières commandes dirigent uniquement la sortie standard vers le fichier combiné.txt, car l'erreur standard a été dupliquée à partir de la sortie standard avant que la sortie standard ne soit redirigée vers le combiné.txt
Sur la deuxième commande, la sortie standard a été redirigée vers le fichier combiné.txt, puis l'erreur standard a été redirigée vers stdout.
Tuyaux
D'après le manuel bash :Un pipeline est une séquence d'une ou plusieurs commandes séparées par l'un des opérateurs de contrôle | ou |& .
Le premier opérateur connecte la sortie standard de la première commande à l'entrée standard de la seconde. Par exemple, si je ne me souviens pas que je peux utiliser des caractères génériques dans la commande ls et que je souhaite répertorier tous les scripts shell du dossier actuel, je peux faire un ls et filtrez la sortie avec grep :
Les gens de Perl ont une devise :"Il y a plus d'une façon de le faire ». Personnellement, je pense que cela devrait s'appliquer (presque) partout.
Le deuxième opérateur relie l'erreur standard de la première commande à l'entrée standard de la seconde. Par exemple, j'utilise la commande tr (qui traduit les caractères) pour se moquer des messages d'erreur :
J'ai également défini la variable shell LANG pour changer la sortie de l'espagnol à l'anglais.
Substitution de commandes
Avec la substitution de commande, nous pouvons exécuter une commande dans notre script et utiliser la sortie de cette commande. Il est plus facile de comprendre comment cela fonctionne avec un exemple. La commande seq est utilisée pour produire une séquence de nombres :
Par exemple, nous pouvons utiliser cette sortie pour créer des dossiers avec des noms séquentiels avec substitution de commande. Nous pouvons utiliser `command` ou $(commande) .
Dans cet exemple, nous affectons la sortie de seq 1 5 à la variable i , et utilisez-le dans une boucle for.
Restez à l'écoute
Jusqu'à présent, nous en avons assez pour que l'ordinateur fasse (une grande partie) du travail à notre place. C'est à vous d'enquêter sur ces petits outils qui font une tâche mais qui le font très bien et de les intégrer via des scripts ou dans la ligne de commande.
Pour le dernier article de cette série, je vais me concentrer sur la dialogue programme pour créer une interface graphique (en fait un TUI) pour ajouter de l'interactivité à nos scripts.