Introduction aux redirections de coquille de bash

Introduction aux redirections de coquille de bash

Objectif

Apprenez à utiliser les redirections, les tuyaux et le tee dans la coquille de bash

Système d'exploitation et versions logicielles

  • Système opérateur: - Distribution Linux agnostique

Exigences

  • Accès à une coquille de bash

Conventions

  • # - Exige que les commandes Linux soient exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
  • $ - Exige que les commandes Linux soient exécutées en tant qu'utilisateur non privilégié régulier

Introduction

La redirection est la possibilité de rediriger l'entrée et la sortie de diverses commandes vers et depuis les fichiers ou les appareils. Nous allons voir comment la redirection fonctionne dans Bash: le shell par défaut dans la majorité des distributions Linux.



Descripteurs de fichiers

Chaque fois que vous exécutez un programme, trois descripteurs de fichiers sont créés par défaut:

  • 0 - stdin (entrée standard)
  • 1 - stdout (sortie standard)
  • 2 - stderr (erreur standard)

Par défaut le stdout et stderr Les descripteurs sont «joints» à l'écran, ce qui signifie que la sortie du programme et ses erreurs ne sont enregistrées dans aucun fichier, mais simplement affichée, tandis que l'entrée standard est attachée au clavier. Les opérateurs de redirection nous ont manipulé ces associations.

Rediriger la sortie standard

Comme indiqué ci-dessus, par défaut, la sortie standard d'un programme est envoyée à l'écran, mais dans certaines circonstances, comme par exemple dans le contexte d'un script, nous pouvons vouloir le rejeter, ou peut-être l'envoyer à un fichier. Comment accomplir cela? La clé ici est l'opérateur:

Sortie ls -l>.SMS 

Dans ce petit exemple, nous avons redirigé la sortie du LS Commande à la sortie du fichier.txt (remarquez que le fichier n'a pas besoin d'exister, il est créé automatiquement). Rien n'est apparu à l'écran, mais si nous vérifions le contenu du fichier, nous allons voir quelque chose de bien familier:



$ la production de chat.txt total 36 drwxr-xr-x. 2 egdoc egdoc 4096 22 juin 19:36 Desktop Drwxr-xr-x. 2 Egdoc Egdoc 4096 22 juin 19:36 Documents DRWXR-XR-X. 2 Egdoc Egdoc 4096 23 juin 02:40 Téléchargements drwxrwxr-x. 13 Egdoc Egdoc 4096 23 juin 08:13 GIT DRWXR-XR-X. 2 egdoc egdoc 4096 22 juin 19:36 Musique -rw-rw-r--. 1 egdoc egdoc 0 juin 23 09:38 Sortie.txt drwxr-xr-x. 2 egdoc egdoc 4096 22 juin 19:39 images drwxr-xr-x. 2 egdoc egdoc 4096 22 juin 19:36 public drwxr-xr-x. 2 Egdoc Egdoc 4096 22 juin 19:36 Templates DRWXR-XR-X. 2 egdoc egdoc 4096 22 juin 19:36 vidéos 

Ce que nous voyons, c'est la sortie du LS commande. Si nous réessayons maintenant la redirection, le contenu actuel du fichier sera remplacé par la nouvelle sortie. Comment pouvons-nous préserver le contenu précédent, et juste ajouter De nouvelles lignes? Dans ce cas, nous utilisons le >> opérateur:

LS -L >> Sortie.SMS 

De cette façon, si le fichier n'existe pas ou qu'il n'a pas de contenu, la redirection aura le même effet que si nous avons utilisé le > Opérateur, sinon le nouveau contenu sera annexé à celui existant, comme vous pouvez le voir en observant à nouveau le fichier:

total 36 drwxr-xr-x. 2 egdoc egdoc 4096 22 juin 19:36 Desktop Drwxr-xr-x. 2 Egdoc Egdoc 4096 22 juin 19:36 Documents DRWXR-XR-X. 2 Egdoc Egdoc 4096 23 juin 02:40 Téléchargements drwxrwxr-x. 13 Egdoc Egdoc 4096 23 juin 08:13 GIT DRWXR-XR-X. 2 egdoc egdoc 4096 22 juin 19:36 Musique -rw-rw-r--. 1 egdoc egdoc 0 juin 23 09:38 Sortie.txt drwxr-xr-x. 2 egdoc egdoc 4096 22 juin 19:39 images drwxr-xr-x. 2 egdoc egdoc 4096 22 juin 19:36 public drwxr-xr-x. 2 Egdoc Egdoc 4096 22 juin 19:36 Templates DRWXR-XR-X. 2 Egdoc Egdoc 4096 22 juin 19:36 Videos Total 40 DRWXR-XR-X. 2 egdoc egdoc 4096 22 juin 19:36 Desktop Drwxr-xr-x. 2 Egdoc Egdoc 4096 22 juin 19:36 Documents DRWXR-XR-X. 2 Egdoc Egdoc 4096 23 juin 02:40 Téléchargements drwxrwxr-x. 13 Egdoc Egdoc 4096 23 juin 08:13 GIT DRWXR-XR-X. 2 egdoc egdoc 4096 22 juin 19:36 Musique -rw-rw-r--. 1 Egdoc Egdoc 541 23 juin 09:38 Sortie.txt drwxr-xr-x. 2 egdoc egdoc 4096 22 juin 19:39 images drwxr-xr-x. 2 egdoc egdoc 4096 22 juin 19:36 public drwxr-xr-x. 2 Egdoc Egdoc 4096 22 juin 19:36 Templates DRWXR-XR-X. 2 egdoc egdoc 4096 22 juin 19:36 vidéos 


Nous pouvons également avoir besoin de rediriger la sortie de plusieurs commandes à la fois: nous pouvons obtenir le résultat recherché en utilisant des accolades bouclées pour les regrouper:

$ echo "LinuxConfig"; ls -l; > sortie.SMS

Le résultat.Le fichier txt contiendra désormais à la fois la chaîne «LinuxConfig» et le résultat du ls -l commande.

Une autre opération commune consiste à rejeter complètement la sortie d'une commande, cette fois la redirigeant vers un dispositif spécial: / dev / null. Dans les systèmes d'exploitation de type Unix / dev / null (également connu sous le nom de Bit Bucket), est un appareil qui rejette toutes les données qui lui sont écrites:

ls -l> / dev / null

Rediriger à la fois la sortie standard et l'erreur standard

Dans les exemples ci-dessus, nous venons de rediriger la sortie standard. Si une sorte d'erreur se produit, nous pourrons toujours voir le message d'erreur à l'écran:

$ ls -l non existant.txt> / dev / null LS: Impossible d'accéder à 'non existant.txt ': aucun fichier ou répertoire de ce type 

Cela se produit parce que, comme dit ci-dessus, stdout et stderr Les descripteurs sont complètement séparés les uns par les autres. Que pouvons-nous faire donc pour les rediriger tous les deux? Il y a deux syntaxes que nous pouvons utiliser pour accomplir cette tâche: la première, qui fonctionne même dans les anciennes versions de la coquille, est la suivante:

Sortie ls -l>.txt 2> & 1

Qu'avons-nous fait? Tout d'abord, nous avons redirigé le stdout de la commande à la sortie.fichier txt, tout comme nous l'avons fait auparavant, nous avons redirigé le stderr au stdout. Veuillez remarquer comment nous avons référencé des descripteurs de fichiers par leurs nombres respectifs. Pour une version de bash raisonnablement moderne, nous pouvons utiliser cette autre syntaxe plus rationalisée:

Sortie ls -l &>.SMS


Rediriger la sortie standard vers l'erreur standard

Imaginez que vous écrivez un script et que vous souhaitez gérer un cas lorsqu'une instruction spécifique échoue, en affichant à l'utilisateur un message d'erreur. Comment accomplisseriez-vous cela? La première chose qui vient à l'esprit est de juste écho le message recherché puis quittez probablement le script avec le code d'erreur approprié. Ce serait parfaitement bien, mais demandez-vous sur quel descripteur ce message sera «envoyé»? C'est le stdout de la écho commande, mais en même temps, si nous voyons les choses du point de vue du script, comme un message d'erreur, il doit utiliser le stderr descripteur. Ce que nous voulons faire ici, c'est de rediriger stdout pour stderr. Nous utilisons la syntaxe suivante pour accomplir la tâche:

Echo "Une erreur s'est produite, au revoir!"> & 2

Ce n'est sûrement pas le plus utile des messages d'erreur, mais cela suffit pour notre exemple.

Redirection d'entrée standard

Comme nous l'avons dit précédemment, par défaut, l'entrée standard est associée au clavier, mais en utilisant le < opérateur, nous pouvons créer certains programmes pour accepter les commentaires d'autres sources. Voyons un exemple rapide en utilisant le tr commande (comme vous le savez probablement tr est utilisé pour supprimer ou traduire des caractères). Cela fonctionne normalement de cette façon:

TR 'GOOT TAY!'T D

Nous voulons tr une chaîne, spécifiant d'abord le caractère que vous souhaitez modifier, puis celui qu'il doit utiliser pour le remplacer. Dans ce cas, nous passons la chaîne 'GOOT TAY!'directement, en utilisant le clavier: il sera traduit par' Bonne journée!'. Ce que nous allons faire pour démontrer stdin Redirection, consiste à écrire la chaîne dans un fichier, puis à rediriger le contenu du fichier vers le stdin de la tr commande.

Nous écrivons d'abord 'gobe!'à la sortie.fichier txt

$ echo 'goot tay!'> Sortie.SMS

Ensuite, nous envoyons son contenu au stdin de tr:

$ tr < output.txt t d good day! 

Comme vous pouvez le voir, tout s'est passé comme prévu, et un joli message a été imprimé à l'écran.



Pipelines

Utilisation de l'opérateur de tuyau | Nous pouvons enchaîner plusieurs commandes ensemble, afin que le stdout du commandement à gauche de l'opérateur est transmis au stdin du commandement à droite. Nous pouvons le démontrer rapidement, en utilisant le tr Commande à nouveau:

$ Echo 'Day de la gueule!'| tr t d bonne journée! 

Ce qui s'est passé? La sortie standard de la commande echo (composée de la chaîne 'goot tay!') est pénétrant à l'entrée standard du tr Commande, qui traduit la chaîne. Enfin, nous voyons tr Sortie standard à l'écran. Mais bien sûr, le tuyau peut continuer. Imaginez que nous voulons que le mot «bon» soit affiché:

$ echo 'goot tay!'| tr t d | Cut -f 1 -d "

Ce que nous avons fait ici, c'est ajouter le couper commande au tuyau, passant le stdout de tr à son stdin. Le couper La commande utilise l'espace comme délimiteur (-d commutateur) et ne sélectionne que le premier champ, renvoyant la chaîne «bon».

Utilisation du tee-shirt

Le tee La commande lit l'entrée standard et la redirige à la fois vers la sortie standard et vers un fichier en même temps, ce qui permet de créer un «T» dans notre tuyau. Réutilisons l'exemple ci-dessus, cette fois en envoyant le résultat intermédiaire ('Bonne journée!') Aussi à la sortie.fichier txt:

$ echo 'goot tay!'| tr t d | tee-out.txt | Cut -f 1 -d "

La sortie à l'écran sera la même qu'avant («bon»), mais si nous lisons la sortie.Fichier TXT, nous pouvons voir que la 'Bonne journée!'La chaîne y a été écrite. C'est parce que 'Bonne journée!'était la sortie standard qui coulait dans le tuyau lorsque nous avons inséré notre tee.

Tee est également utile est quelques circonstances spécifiques. Par exemple, si vous essayez de «faire écho» quelque chose à un fichier qui a besoin de privilèges racine à écrire, vous remarquerez que les choses n'iront pas comme prévu:

$ sudo echo "LinuxConfig.org "> protégé.txt -Bash: protégé.TXT: Permission refusée 


Ce qui s'est passé? Vous vous attendiez probablement à ce que la commande réussisse, car vous l'avez préfixée avec sudo, mais elle a échoué de toute façon. C'est parce que tu viens de diriger le écho commande avec les privilèges, mais cela ne vous a pas donné des autorisations d'écriture sur le fichier. Essayons à la place de cette façon:

$ echo "LinuxConfig.org "| sud-sud protégé.txt> / dev / null

Ici, nous exécutons Echo en tant qu'utilisateur normal, mais la redirection elle-même est effectuée avec des privilèges racine, donc cette fois la commande réussit. Nous avons également ajouté une redirection supplémentaire vers / dev / null, Parce que nous n'avions pas besoin que la sortie soit affichée à l'écran.

Notez qu'à l'aide de cette technique, la sortie ne sera pas annexée dans le fichier de destination: ce dernier sera écrasé et son contenu précédent sera perdu. Pour ajouter au fichier, nous devons ajouter le -un basculer vers tee (abréviation de -nape).

Soyez prudent, juste un peu de distraction ici peut provoquer des choses horribles!

Tutoriels Linux connexes:

  • Choses à installer sur Ubuntu 20.04
  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Introduction aux tuyaux nommés sur Bash Shell
  • Gestion de la saisie des utilisateurs dans les scripts bash
  • Choses à faire après l'installation d'Ubuntu 20.04 Focal Fossa Linux
  • Masterring Bash Script Loops
  • Fichiers de configuration Linux: 30 premiers
  • Mint 20: Mieux que Ubuntu et Microsoft Windows?
  • Linux peut-il obtenir des virus? Exploration de la vulnérabilité de Linux…
  • Téléchargement Linux