Next Previous Contents >

3. La redirection des canaux d'entrées/sorties (`>', `>>', `>|', `<', `>&')

>En quoi consiste la redirection des canaux d'entrées/sorties ? Imaginez : vous désirez étudier la liste complète des fichiers de votre système, obtenue grâce à la commande `find /' par exemple. Cependant, la liste est longue et défile bien trop rapidement pour permettre une quelconque étude... l'idéal serait de pouvoir stocker cette liste dans un fichier au lieu de l'afficher ; vous pourriez ainsi la consulter à votre guise grâce à votre éditeur de texte préféré. Vous venez de découvrir la redirection de la sortie standard :-) Mais comment indiquer au shell, au moment de la saisie du texte de la commande, que vous souhaiteriez rediriger certains canaux standards ? >

3.1 La redirection du canal de sortie standard (`1>', `1>>', `1>|')

>Vous souhaitez rediriger la sortie standard, le canal numéro 1, vers le fichier `foo'. Il vous faudrait alors ajouter des indications de redirection à la suite du texte habituel de votre commande : >
  • >`find / 1>foo' si vous désirez stocker la sortie de la commande `find /' dans le fichier `foo'. Veillez à ce que le fichier `foo' n'existe pas au moment où vous exécutez votre commande. >
  • >`find / 1>>foo' si vous désirez stocker la sortie de la commande `find /' à la fin du fichier `foo' déjà existant. >
  • >`find / 1>|foo' si vous désirez stocker la sortie de la commande `find /' dans le fichier `foo'. Si le fichier n'existe pas, il est créé et s'il existe, il est écrasé. >
> >Quelques remarques s'imposent... Il est possible d'indiquer la redirection de la sortie standard de manière plus concise : vous pouvez en effet remplacer `1>' par `>' et obtenir le même résultat. Ensuite, `foo' peut être remplacé par un nom quelconque de fichier. En particulier, certains fichiers du répertoire `/dev' peuvent jouer un rôle très intéressant dans la redirection des canaux de sortie : le fichier `/dev/null' par exemple. Ce fichier est en quelque sorte un puits sans fond : tout ce qui est envoyé vers lui est englouti et perdu à jamais. Si vous exécutez `find / >/dev/null', vous ne pourrez jamais consulter la sortie standard de cette commande. Mais pourquoi indiquer la redirection avec `>/dev/null' alors que le fichier `/dev/null' existe ? La réponse est simple : la plupart des fichiers du répertoire `/dev' sont des fichiers spéciaux du kernel. Ainsi, lorsque vous écrivez `find / >/dev/null', votre système sait que la sortie standard de la commande `find /' doit être supprimée définitivement. >

3.2 La redirection du canal standard d'erreur (`2>', `2>>', `2>|')

>Vous souhaitez rediriger le canal standard d'erreur, le canal numéro 2 : tout ce qui a été dit au sujet de la redirection du canal de sortie standard reste valable ici, il vous suffit de remplacer les `1>' par des `2>'. Le raccourci `>' n'est bien entendu plus valable, puisque le shell serait alors incapable de faire la différence entre une redirection du canal de sortie et une redirection du canal d'erreur. >

3.3 La redirection du canal d'entrée standard (`0<')

Imaginez : vous travaillez dans un laboratoire scientifique et vous êtes chargé de réaliser des calculs statistiques dans les plus brefs délais. Pour ce faire, vous disposez, d'une part, du programme de calcul statistique `bar' et, d'autre part, d'un fichier `bar.in' contenant des milliers de lignes de données. Le programme `bar', une fois exécuté, attend que vous saisissiez une à une vos données au clavier. Au bout de la 42ème donnée saisie, vous réalisez que vous n'y arriverez jamais. Si seulement vous pouviez indiquer au programme `bar' de lire les données directement depuis le fichier `bar.in'... vous ne pouvez malheureusement pas modifier le programme `bar' lui-même, puisque vous ne disposez pas de son code source, le programme `bar' n'étant pas distribué sous les termes d'une licence libre du type GPL. Il vous reste cependant une solution : rediriger le canal d'entrée standard, en exécutant la commande `bar 0<bar.in' ou `bar <bar.in'. >

3.4 La redirection d'un canal de sortie vers un autre canal de sortie (`>&')

>Si vous désirez exécuter la commande `blah' sans qu'aucun message ne soit affiché à l'écran (qu'il s'agisse d'un message normal ou d'un message d'erreur), vous pouvez rediriger le canal de sortie et le canal d'erreur vers `/dev/null' en exécutant `blah 1>/dev/null 2>/dev/null'. Mais si vous souhaitez rediriger ces deux canaux vers un fichier dont le nom est bien plus compliqué que `/dev/null', vous disposez d'une solution nettement plus élégante... rediriger dans un premier temps le canal de sortie standard vers ce fichier, puis rediriger le canal d'erreur vers le canal de sortie standard, en exécutant la commande `blah 1>/dev/null 2>&1'. > >Et pourquoi ne pas exécuter `blah 2>&1 1>/dev/null' afin d'obtenir un résultat identique ? Parce que vous n'obtiendriez pas le même résultat ;-) En saisissant cette ligne de commande, vous commencez par rediriger le canal d'erreur vers le canal de sortie, qui correspond alors à votre écran. Tout ce qui sera envoyé vers le canal d'erreur apparaîtra donc sur votre moniteur. Vous redirigez ensuite le canal de sortie vers `/dev/null' : vous ne verrez plus les messages standards de la commande `blah', mais vous verrez toujours ses messages d'erreur. > > Next Previous Contents