Unix / Linux - Redirections d'entrée / sortie du shell

Dans ce chapitre, nous discuterons en détail des redirections d'entrée / sortie Shell. La plupart des commandes système Unix prennent les entrées de votre terminal et renvoient la sortie résultante vers votre terminal. Une commande lit normalement son entrée à partir de l'entrée standard, qui se trouve être votre terminal par défaut. De même, une commande écrit normalement sa sortie sur la sortie standard, qui est à nouveau votre terminal par défaut.

Redirection de sortie

La sortie d'une commande normalement destinée à la sortie standard peut être facilement détournée vers un fichier à la place. Cette capacité est connue sous le nom de redirection de sortie.

Si la notation> file est ajoutée à une commande qui écrit normalement sa sortie sur la sortie standard, la sortie de cette commande sera écrite dans un fichier au lieu de votre terminal.

Vérifiez les éléments suivants who commande qui redirige la sortie complète de la commande dans le fichier utilisateurs.

$ who > users

Notez qu'aucune sortie n'apparaît sur le terminal. En effet, la sortie a été redirigée du périphérique de sortie standard par défaut (le terminal) vers le fichier spécifié. Vous pouvez vérifier le fichier des utilisateurs pour le contenu complet -

$ cat users
oko         tty01   Sep 12 07:30
ai          tty15   Sep 12 13:32
ruth        tty21   Sep 12 10:10
pat         tty24   Sep 12 13:07
steve       tty25   Sep 12 13:03
$

Si une commande a sa sortie redirigée vers un fichier et que le fichier contient déjà des données, ces données seront perdues. Prenons l'exemple suivant -

$ echo line 1 > users
$ cat users
line 1
$

Vous pouvez utiliser l'opérateur >> pour ajouter la sortie dans un fichier existant comme suit -

$ echo line 2 >> users
$ cat users
line 1
line 2
$

Redirection d'entrée

Tout comme la sortie d'une commande peut être redirigée vers un fichier, l'entrée d'une commande peut également être redirigée à partir d'un fichier. Comme legreater-than character > est utilisé pour la redirection de sortie, le less-than character < est utilisé pour rediriger l'entrée d'une commande.

Les commandes qui prennent normalement leur entrée à partir de l'entrée standard peuvent avoir leur entrée redirigée à partir d'un fichier de cette manière. Par exemple, pour compter le nombre de lignes dans le fichier généré par les utilisateurs ci-dessus, vous pouvez exécuter la commande comme suit -

$ wc -l users
2 users
$

Lors de l'exécution, vous recevrez la sortie suivante. Vous pouvez compter le nombre de lignes dans le fichier en redirigeant l'entrée standard duwccommande des utilisateurs du fichier -

$ wc -l < users
2
$

Notez qu'il existe une différence dans la sortie produite par les deux formes de la commande wc. Dans le premier cas, le nom des utilisateurs du fichier est répertorié avec le nombre de lignes; dans le second cas, ce n'est pas le cas.

Dans le premier cas, wc sait qu'il lit son entrée auprès des utilisateurs du fichier. Dans le second cas, il sait seulement qu'il lit son entrée à partir de l'entrée standard et n'affiche donc pas le nom du fichier.

Document ici

UNE here document est utilisé pour rediriger l'entrée dans un script ou un programme shell interactif.

Nous pouvons exécuter un programme interactif dans un script shell sans action de l'utilisateur en fournissant l'entrée requise pour le programme interactif ou le script shell interactif.

La forme générale d'un here le document est -

command << delimiter
document
delimiter

Ici, le shell interprète le <<opérateur comme instruction pour lire l'entrée jusqu'à ce qu'il trouve une ligne contenant le délimiteur spécifié. Toutes les lignes d'entrée jusqu'à la ligne contenant le délimiteur sont ensuite introduites dans l'entrée standard de la commande.

Le délimiteur indique au shell que le herele document est terminé. Sans cela, le shell continue de lire l'entrée pour toujours. Le délimiteur doit être un mot unique qui ne contient ni espaces ni tabulations.

Voici l'entrée de la commande wc -l pour compter le nombre total de lignes -

$wc -l << EOF
   This is a simple lookup program 
	for good (and bad) restaurants
	in Cape Town.
EOF
3
$

Vous pouvez utiliser le here document pour imprimer plusieurs lignes en utilisant votre script comme suit -

#!/bin/sh

cat << EOF
This is a simple lookup program 
for good (and bad) restaurants
in Cape Town.
EOF

Lors de l'exécution, vous recevrez le résultat suivant -

This is a simple lookup program
for good (and bad) restaurants
in Cape Town.

Le script suivant exécute une session avec le vi éditeur de texte et enregistre l'entrée dans le fichier test.txt.

#!/bin/sh

filename=test.txt
vi $filename <<EndOfCommands
i
This file was created automatically from
a shell script
^[
ZZ
EndOfCommands

Si vous exécutez ce script avec vim agissant en tant que vi, vous verrez probablement une sortie comme celle-ci -

$ sh test.sh
Vim: Warning: Input is not from a terminal
$

Après avoir exécuté le script, vous devriez voir ce qui suit ajouté au fichier test.txt -

$ cat test.txt
This file was created automatically from
a shell script
$

Supprimer la sortie

Parfois, vous devrez exécuter une commande, mais vous ne voulez pas que la sortie s'affiche à l'écran. Dans de tels cas, vous pouvez supprimer la sortie en la redirigeant vers le fichier/dev/null -

$ command > /dev/null

Ici, commande est le nom de la commande que vous souhaitez exécuter. Le fichier/dev/null est un fichier spécial qui rejette automatiquement toutes ses entrées.

Pour ignorer à la fois la sortie d'une commande et sa sortie d'erreur, utilisez la redirection standard pour rediriger STDERR à STDOUT -

$ command > /dev/null 2>&1

Ici 2 représente STDERR et 1 représente STDOUT. Vous pouvez afficher un message sur STDERR en redirigeant STDOUT vers STDERR comme suit -

$ echo message 1>&2

Commandes de redirection

Voici une liste complète des commandes que vous pouvez utiliser pour la redirection -

Sr.No. Commande et description
1

pgm > file

La sortie de pgm est redirigée vers le fichier

2

pgm < file

Le programme pgm lit son entrée à partir d'un fichier

3

pgm >> file

La sortie de pgm est ajoutée au fichier

4

n > file

Sortie du flux avec descripteur n redirigé vers le fichier

5

n >> file

Sortie du flux avec descripteur n ajouté au fichier

6

n >& m

Fusionne la sortie du flux n avec stream m

sept

n <& m

Fusionne l'entrée du flux n avec stream m

8

<< tag

L'entrée standard vient d'ici à la balise suivante en début de ligne

9

|

Prend la sortie d'un programme ou processus et l'envoie à un autre

Notez que le descripteur de fichier 0 est normalement une entrée standard (STDIN), 1 est la sortie standard (STDOUT), et 2 est la sortie d'erreur standard (STDERR).