GNU/Linux >> Tutoriels Linux >  >> Linux

La redirection bash expliquée avec des exemples

La redirection et la canalisation sont deux fonctionnalités utiles dans les scripts bash que les administrateurs système et les développeurs utilisent souvent. Dans ce guide, nous discuterons de ce qu'est la redirection bash et comment travailler avec la redirection dans Bash avec des exemples de commandes.

Avant de comprendre comment fonctionne la redirection, il est important de savoir ce qu'est un descripteur de fichier.

Qu'est-ce qu'un descripteur de fichier ?

Lorsque vous ouvrez un fichier sous Linux, chaque fichier se voit attribuer un entier et cette information est stockée dans le noyau. De cette façon, le noyau sait quels fichiers sont ouverts et quel processus a ouvert les fichiers. Le nombre entier attribué est ce que nous appelons le descripteur de fichier (en abrégé FD).

Par défaut, chaque programme démarrera avec trois descripteurs de fichiers.

  • FD 0 -> Entrée standard (stdin) -> Clavier
  • FD 1 -> Sortie standard (Stdout) -> Affichage (Terminal)
  • FD 2 -> Erreur standard (Stderr) -> Affichage (Terminal)

Vous pouvez voir les descripteurs de fichiers dans /dev répertoire :

$ ls -l /dev/std* lrwxrwxrwx 1 racine racine 15 août 27 21:32 /dev/stderr -> /proc/self/fd/2lrwxrwxrwx 1 racine racine 15 août 27 21:32 /dev/stdin -> /proc/self/fd/0lrwxrwxrwx 1 racine racine 15 août 27 21:32 /dev/stdout -> /proc/self/fd/1

Stdin (FD0) reçoit l'entrée du clavier. stdout (FD1) et stderr (FD2) sont envoyés au terminal. Lorsque vous utilisez les canaux et les redirections, vous pouvez modifier la manière dont les entrées sont transmises et les sorties et les erreurs sont envoyées.

Redirection de la sortie vers un fichier

Comme indiqué précédemment, la sortie (stdout) et l'erreur (stderr) de tout programme sont envoyées au terminal. Vous pouvez utiliser l'opérateur de redirection ">" pour écrire les stdout et stderr dans un fichier.

Jetez un oeil à l'exemple ci-dessous. J'exécute le uname -mrs commande et rediriger la sortie vers un fichier nommé uname.log .

$ uname -mrs> uname.log
$ chat uname.log 
Linux 5.10.0-8-amd64 x86_64

Attention : Lors de l'utilisation de ">" opérateur, si le fichier n'est pas disponible, il sera créé. Et si le fichier existe déjà, il sera remplacé par un nouveau contenu.

Vous pouvez également utiliser le numéro de descripteur de fichier pour stdout(1) avant l'opérateur de redirection pour rediriger la sortie vers un fichier.

$ uname -mrs 1> uname.log

Comme je l'ai déjà mentionné, un seul opérateur de redirection (> ) ne remplacera le contenu d'un fichier que si le fichier existe déjà. Toutefois, si vous souhaitez ajouter le contenu au lieu de l'écraser dans le même fichier, utilisez l'opérateur de double redirection (c'est-à-dire >> ). Vous pouvez également utiliser le descripteur de fichier stdout (1) ici aussi.

$ whoami>> uname.log
$ echo $SHELL 1>> uname.log
$ cat uname.log Linux 5.10.0-8-amd64 x86_64ostechnix/bin/bash

Comment gérer Stderr

Chaque programme génère à la fois une sortie et une erreur et les deux sont envoyés au terminal. Dans de nombreux cas, vous souhaiterez peut-être ignorer l'erreur ou isoler les erreurs et les rediriger vers un fichier séparé pour le dépannage.

Prenons un exemple simple d'exécution du ls commande pour voir comment cela fonctionne. J'essaie de lister deux fichiers dont un seul est présent. Je reçois à la fois mon erreur et mon résultat dans le terminal, comme je l'ai déjà dit.

$ ls -l uname.log u1.log ls :impossible d'accéder à 'u1.log' :aucun fichier ou répertoire de ce type-rw-r--r-- 1 ostechnix ostechnix 48 août 27 07:37 uname.log

J'exécute le même ls commande à nouveau mais cette fois en redirigeant la sortie vers un fichier. Comme vous pouvez le voir sur la sortie > l'opérateur redirige stdout(1) vers un fichier mais stderr(2) est envoyé au terminal.

$ ls -l uname.log u1.log> ls.op ls :impossible d'accéder à 'u1.log' :aucun fichier ou répertoire de ce type

Pour rediriger stderr vers un fichier, utilisez le "2>" opérateur. Il est obligatoire d'utiliser le descripteur de fichier pour stderr(2) avant l'opérateur de redirection> qui enverra l'erreur seule vers un fichier.

$ ls -l uname.log u1.log> ls.op 2> ls.err
$ cat ls.err ls :impossible d'accéder à 'u1.log' :aucun fichier ou répertoire de ce type

Maintenant, stdout et stderr sont écrits dans des fichiers séparés. Vous pouvez également envoyer stdout et stderr dans un seul fichier.

$ ls -l uname.log u1.log 1> ls.op 2> ls.op

À partir de bash 4.4 , vous pouvez également utiliser &> sign pour rediriger à la fois stdout et stderr vers un fichier.

$ ls -l uname.log u1.log &> ls.op

Qu'est-ce que /dev/null ?

Null est un fichier spécial de caractères qui accepte l'entrée et rejette l'entrée et ne produit aucune sortie. Pour faire simple, null supprime tout ce que vous redirigez vers lui.

$ ls -l /dev/null crw-rw-rw- 1 racine racine 1, 3 27 août 06:01 /dev/null

Pourquoi le null est-il important dans la redirection ? Vous pourriez vous demander. Dans certains cas, vous souhaiterez peut-être ne pas imprimer ou stocker stdout ou stderr. Dans ce cas, vous pouvez rediriger stdout ou stderr vers /dev/null qui supprimera le flux d'entrée.

$ date> /dev/null$ date 1> /dev/null # Stdout à Null$ dateee 2> /dev/null # COMMANDE INCORRECTE, Stderr à Null$ date &> /dev/null # Stdout/Stderr à Nul

Redirection d'entrée dans Bash

De la même manière que vous redirigez la sortie et l'erreur vers un fichier, vous pouvez également transmettre des entrées à une commande à l'aide de l'opérateur de redirection d'entrée (< ).

Commençons par un simple programme de comptage de mots. Ici, je redirige le contenu de ostechnix.txt fichier au nombre de mots pour trouver le nombre de lignes.

$ wc -l <​​ostechnix.txt  10

Vous pouvez également passer le descripteur de fichier stdin (0) lors de la redirection de l'entrée.

$ wc -l 0 10

Vous pouvez combiner les opérateurs de redirection d'entrée et de sortie comme indiqué ci-dessous.

$ wc -l <​​ostechnix.txt &> /tmp/wc.op
$ chat /tmp/wc.op  10

La redirection d'entrée sera utilisée avec une boucle while pour lire le contenu d'un fichier ligne par ligne.

Jetez un oeil à l'exemple ci-dessous. Je passe le /etc/passwd fichier comme entrée du while commande. Ici le read la commande lira ligne par ligne et la stockera dans la variable VAL et plus bas dans la boucle, la condition est écrite pour vérifier si l'utilisateur est disponible.

pendant la lecture de VAL ; do NAME=$(echo $VAL | awk -F ":" '/1/ {print $1}' ) if [[ $NAME ="karthick" ]] then echo "User spotted" fidone   

Un script pour trouver l'utilisateur du système

Remplacez "karthick" dans le code ci-dessus par le nom d'utilisateur de votre système. Enregistrez le fichier et fermez-le.

Ce n'est pas un moyen optimal d'accomplir la tâche de trouver l'utilisateur, mais à des fins de démonstration, cela suffira.

Maintenant, rendez le script exécutable et exécutez-le :

$ chmod +x ostechnix.sh 
$ ./ostechnix.sh 
Utilisateur repéré

Bash prend en charge une autre forme de redirection d'entrée appelée Heredoc . Pour plus de détails, consultez le guide suivant :

  • Tutoriel Bash Heredoc pour les débutants

Résumé

Dans ce guide, nous avons appris quelques concepts de script importants tels que la redirection Bash, le descripteur de fichier, comment rediriger une sortie vers un fichier, comment gérer stderr, qu'est-ce que /dev/null et comment il est utilisé dans Bash redirection, et enfin nous avons terminé le guide avec la redirection d'entrée dans Bash.

Si vous souhaitez apprendre les scripts Bash, vous devez apprendre et vous familiariser avec les concepts expliqués ici. Pour vous mettre à l'aise, je vous suggère d'essayer toutes les commandes que nous avons montrées dans cet article dans votre système.

Si vous avez des commentaires ou des conseils qui aideront la communauté Linux et nos lecteurs à apprendre les scripts bash, n'hésitez pas à nous le faire savoir dans la section des commentaires ci-dessous.

Suggestion de lecture :

  • Scripts bash – Variables expliquées à l'aide d'exemples
  • Scripts bash – Fonctions expliquées à l'aide d'exemples
  • Scripts bash – Explication de la boucle For avec des exemples
  • Scripts bash :boucle While et Until expliquée à l'aide d'exemples
  • La commande Bash Echo expliquée avec des exemples sous Linux
  • La liste des raccourcis clavier Bash utiles
  • Différence entre la définition de variables bash avec et sans exportation

Linux
  1. Comment écrire un script bash avec des exemples

  2. Tutoriel Bash HereDoc avec exemples

  3. La commande Linux cksum expliquée pour les débutants (avec des exemples)

  4. Instruction Bash If-Else avec des exemples

  5. Comment créer et monter un système de fichiers Btrfs (expliqué avec des exemples)

Bash Scripting - Commande Printf expliquée avec des exemples

Bash Scripting - Tableau associatif expliqué avec des exemples

Bash Scripting - Tableau indexé expliqué avec des exemples

Commande Tr sous Linux expliquée avec des exemples

Autorisations et propriété des fichiers Linux expliquées avec des exemples

Script bash pour la boucle expliqué avec des exemples