Introduction aux redirections de coquille de bash
- 967
- 83
- Jeanne Dupont
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