Les redirections

Les redirections de fichier ou d'affichage sous UNIX

Les canaux

Lors de l'exécution d'une commande (shell, programme, etc.) il y a deux sorties disponibles, la sortie standard stdout sur le canal 1 et la sortie des erreurs stderr sur le canal 2. Ces canaux sont accessibles pour rediriger les flux de données.

Remarque

Le canal 1, canal standard de sortie peut être omis dans la majorité des cas.

canal 1

Le canal 1 pouvant être omis, on l'utilise souvent sans sans rendre compte.

ls -l > /tmp/ls.txt

redirige le flux de sortie standard (canal 1) vers le fichier /tmp/ls.txt. Cette écriture est équivalente à :

ls -l 1> /tmp/ls.txt

où l'on spécifie clairement le numéro du canal redirigé.

canal 2

Le canal 2 est le canal de sortie des erreurs stderr.

Exemple :

find / -name "*.txt" 2>/dev/null

affiche sur la sortie standard (omise) le résultat de la commande find tout en envoyant les erreurs à la poubelle (/dev/null).

Redirections : sorties

>

La redirection > redirige le canal choisi vers un fichier (par exemple) en forçant sa recréation. C'est à dire que si le fichier de sortie existe déjà, il sera supprimé puis recréé. Les données antérieures seront donc effacées.

Exemple :

ls -l > /tmp/ls.txt

redirige la sortie standard de la commande ls -l vers le fichier /tmp/ls.txt. Le résultat de cette commande qui apparaissait habituellement à l'écran est envoyé dans un fichier.

>>

A la différence du la redirection >, la redirection >> n'écrase pas les données existantes mais ajoute les nouvelles données à la fin du fichier existant. Si le fichier n'existe pas, il est créé.

Exemple :

ls -l >> /tmp/ls.txt

>|

Si le fichier n'existe pas, il est créé mais si le fichier existe déjà, il est écrasé.

Exemple :

ls -l >| /tmp/ls.txt

>&

Redirection vers un autre canal.

Exemple :

ls -l 1>&2

redirige la sortie standard de la commande ls vers la sortie des erreurs. Mais l'inverse est possible.

>>&

Place la sortie standard et la sortie erreur à la fin d'un fichier.

Redirections : entrées

<

Redirige en entrée un contenu vers l'entrée une commande (ou programme).

Exemple :

prog < fichier.txt

Si prog nécessite une série d'entrées (données), plutôt que de taper les données une à une, il est plus simple de tout mettre dans un fichier et de rediriger le contenu de ce fichier vers le programme prog.

Remarque

Cette redirection fonctionne aussi avec /dev/null.

<<

Redirige en entrée une série de données. On nomme aussi cette redirection label. Elle peut servir par exemple, pour définir des lignes multiples à l'entrée d'une commande.

Exemple :

ftp -n << EOF 
open $ServerFTP
user $UserFTP $PassFTP
lcd $PathLocal
cd $PathFTP
$modeFTP
put $file
quit
EOF

Cet exemple transfert automatiquement par ftp un fichier ($file). La commande ftp nécessitant plusieurs lignes, avec à chaque fois des informations différentes, un label (EOF) est nécessaire. Tout ce qui se situe dans le label est envoyé en entrée à la commande ftp qui l'exécute comme si cela avait été tapé à la main.

Exemples

Exemple :

prog < fichier.txt > /tmp/fichier.out

Le programme prog prend le contenu du fichier fichier.txt en entrée et redirige la sortie standard (canal 1) vers le fichier /tmp/fichier.out.

Exemple :

prog < fichier.txt 1> /tmp/fichier.out 2> /tmp/fichier.err

Le programme prog prend le contenu du fichier fichier.txt en entrée et redirige la sortie standard (canal 1) vers le fichier /tmp/fichier.out et les erreurs (canal 2) vers le fichier /tmp/fichier.err.

Exemple :

cat << 'EOF' > /tmp/tempfile
    { sum += $4 }
END { mb = sum / 1024
      gb = mb / 1024
      printf "%.0f MB (%.2fGB) of available disk space\n", mb, gb
    }
EOF

Cet exemple affiche des ligne multiple prise dans le label 'EOF' et les redirige vers le fichier /tmp/tempfile.