Redirection

Tous les programmes démarrent avec 3 canaux d’entrée-sorties déjà ouverts. Ce sont:

  • 0 (stdin) : entrée normale, généralement le clavier
  • 1 (stdout): sortie normale, généralement l’écran
  • 2 (stderr): sortie des messages d’erreur, généralement l’écran

bash nous permet de rediriger ces canaux vers les entrée-sorties qui correspondent à nos besoins. Trois caractères spéciaux ( <>| ) sont utilisés. Supposons le programme unProg:

unProg <  fichier   # utiliser un fichier au lieu du clavier
unProg >  fichier   # rediriger la sortie vers un fichier (le vider d'abord)
unProg >> fichier   # rediriger la sortie vers un fichier (ajouter au fichier)
unProg | autreProg  # rediriger la sortie vers un autre programme

Un exemple:

cat fichier | wc -l # afficher le nombre de lignes du fichier

Le programme cat affiche le contenu d’un fichier mais, dans ce cas-ci, sa sortie n’ira pas vers l’écran mais plutôt vers le programme wc -l qui compte le nombre de ligne dans le texte entré. Dans ce cas-ci, l’entrée de wc n’est pas le clavier mais, à cause de la redirection, c’est plutôt la sortie du programme précédent.

La forme générale d’une redirection de fichier est n> ou n< où n est le numéro du canal d’entrée-sortie. Donc:

unProg 2> fichier_erreurs

redirige le canal 2 (les messages d’erreurs) vers un fichier. On aura compris que > (sans numéro de canal) est une abréviation de 1>.

Fusion de flux

La formulation n>&m permet de fusionner le canal n avec le canal m

Donc. la commande unProg > fichierX 2>&1    signifie:

  • envoyer la sortie normale vers fichierX
  • fusionner le canal2 (erreurs) et le canal1 (sortie normale)

Notez que l’évaluation se fait de gauche à droite et que, par conséquent, la commande unProg  2>&1  >fichierX ne dirige pas les messages d’erreur vers fichierX

Autres exemples:

prog 1> fich1 2>fich2 # rediriger les canaux 1 et 2
prog 2> /dev/null     # diriger la sortie d'erreur vers la poubelle

Note: il ne faut pas insérer d’espace entre les caractères de n> ou n>&m

Dans le cas d’une redirection vers un programme, on ne peut pas spécifier les canaux; c’est toujours 1 vers 0 (sortie normale vers l’entrée). Si c’est vraiment nécessaire, il y a, bien sur, une façon de diriger 2 (les erreurs) vers l’entrée:

unProg 3>&1   1>&2   2>&3 | autreProg  # on permute 1 et 2

Quelques astuces Bash

Même si vous êtes habile pour pianoter sur un clavier, il est possible d’augmenter votre performance en utilisant quelques astuces de bash.

L’auto-complément est évidemment une technique très efficace mais il y a aussi plusieurs astuces d’édition qu’il y a avantage à connaître.

Auto-complément

La touche Tab permet de compléter le mot courant. C’est utile pour les mots longs ou si vous ne vous souvenez pas de l’orthographe exact.

Si le Tab est donné durant le 1er mot, l’expansion du Tab proposera toutes les commandes disponibles qui débutent avec les caractères entrés. S’il n’y en a qu’une, elle s’inscrira dans votre ligne de commande, sinon vous devrez entrer des caractères supplémentaire pour raffiner la sélection.

Si la touche Tab n’est pas dans le 1er mot, alors bash proposera une liste des fichiers du répertoire courant.

L’auto-complément est tellement utile que son concept a été étendu pour le rendre plus intelligent. Mais cette fonctionnalité n’est possible que pour certaines commandes. Pour ces commandes, si le Tab est utilisé ailleurs que dans le 1er mot, alors la recherche sera optimisée en fonction du 1er mot. Par exemple, si vous entrez Tab après man conf, alors bash vous proposera une liste de toutes les pages de manuel des commandes qui débutent par conf.

Nous verrons, dans un autre article, comment on peut ajouter nous-même la fonctionnalité d’auto-complément à une commande quelconque.

Accès à l’historique

Toutes vos lignes de commandes sont mémorisées dans un fichier d’historique. Les touches de flèches verticales vous permettent de vous promener dans l’historique et de récupérer une de ces vieilles commandes. De plus, la combinaison ctrl-r permet de rechercher dans le fichiers d’historique en fonction des caractères que vous entrez.  Un ctrl-r supplémentaire permet d’aller plus loin dans le fichier. Utilisez une touche de flèche horizontale lorsque vous avez la commande désirée ou que vous voulez terminer la recherche. Pour plus de détails.

Mise en commentaire Alt-#

Vous est-il déjà arrivé, en cours d’édition d’une commande, de constater que vous avez un blanc de mémoire? Vous allez alors dans une autre fenêtre (ou un autre onglet) et vous interrogez man. Mais si vous n’avez pas cette autre fenêtre, vous pouvez utiliser l’astuce suivante. Si vous utilisez Alt-# dans votre commande courante, un # sera introduit en début de commande (pour en faire un commentaire) et la commande se terminera sans effet. Après avoir consulté man, la flèche ascendante vous ramène votre commande et il n’y a plus qu’à la compléter et enlever le #.

Rappel du premier mot de la commande précédente

La combinaison Alt-. vous ramène le premier mot de la commande précédente.

Dernier argument !$

Très utile lorsque vous avez à entrer 2 commandes qui se terminent par le même argument. Exemple:

nano chemin/fichier
lp !$

nano est un éditeur de texte et lp est une commande d’impression. L’expansion du !$ récupère le dernier argument de la commande précédente. Vous pouvez obtenir le même résultat en utilisant Esc et . (touche Esc suivie de la touche . )  ou Esc_. Vous pouvez utiliser cette séquence plusieurs fois pour avoir accès au dernier paramètre d’une plus vieille commande.

nième argument

De la même façon qu’avec !$, vous pouvez utiliser !:n pour obtenir le nième argument

Commandes d’édition de la ligne en cours

  • ctrl-a déplace le curseur vers le début de la ligne
  • ctrl-e déplace le curseur vers la fin de la ligne
  • ctrl-t permute le caractère courant avec le précédent (ou les 2 derniers si le curseur est en fin de ligne). C’est très utile.
  • alt-t intervertit 2 mots. Semblable à ctrl-t
  • alt-d supprime le mot (ou portion de mot) après le curseur
  • ctrl-w efface le mot à la gauche du curseur
  • ctrl-u coupe tous les caractères à la gauche du curseur
  • ctrl-k coupe tous les caractères à la droite du curseur
  • ctrl-y ramène les caractères du presse-papier (coupés par ctrl-u ou ctrl-k, etc)
  • ctrl-l efface le contenu de la fenêtre en conservant la ligne courante
  • alt-u met en majuscules le mot (ou portion de mot) qui suit le curseur
  • alt-l met en minuscules le mot (ou portion de mot) qui suit le curseur
  • alt-c met en majuscule la lettre sous le curseur

Autres combinaisons utiles

  • ctrl-c termine le programme en cours
  • ctrl-z met en pause le programme en cours
  • ctrl-l nettoie la fenètre
  • ctrl-s bloque le défilement de texte
  • ctrl-q débloque le défilement de texte
  • ctrl-d signale une fin de fichier. En ligne de commande, il ferme la fenètre

Le presse-papiers du bureau (ne pas confondre avec celui de bash)

  • ctrl-C copier vers le presse-papiers (notez la majuscule qui nécessite Shft)
  • ctrl-V ramener le presse-papiers (notez la majuscule qui nécessite Shft)