Bash

Raccourcis clavier

ctrl-a                  aller au début de la ligne
ctrl-e                  aller à la fin de la ligne
ctrl-d                  quitter la session (equivaut à "exit" ou "logout")
ctrl-l                  effacer tout affichage sur le terminal
ctrl-r<cmd>             recherche les occurrences de <cmd> dans l'historique
ctrl-s                  masquer la saisie (ctrl-q pour rétablir)
ctrl-u                  coupe tout ce qui précède le curseur
ctrl-v + <tab>          insère une "vraie" tabulation
ctrl-w                  couper le mot précédent le curseur
ctrl-y                  coller ce qui a été coupé
alt-c                   effacer le mot précédent
alt-f                   aller au mot suivant
alt-b                   aller au mot précédent
alt-t                   intervertir deux mots (devant et derrière le curseur) 
esc-.                   insère le dernier argument de la commande précédente (fonctionne également avec alt-.)
!!                      réexécute la dernière commande
!XX                     réexécute la dernière commande commençant par XX
<cmd> !*                exécute la commande <cmd> avec tous les paramètres de la dernière commande
<cmd> !$                exécute la commande <cmd> avec le dernier paramètre de la dernière commande

Astuces

Changer la forme et la couleur du prompt (invite de commande)

La forme du prompt shell est stockée dans une variable d'environnement : $PS1.

bash-3.2$ export PS1="\u@\h:\w% "
marc@magma:~%

Les différents switch sont énumérés dans le manuel de Bash (section PROMPTING) ; ici, le prompt affiche l'utilisateur, le nom de la machine ainsi que le répertoire courant. Il est possible de coloriser le prompt avec la syntaxe suivante :

marc@magma:~% export PS1="\033[01;37m$PS1\033[00;00m "

...ce qui donnera ici un prompt blanc gras. Voici les différentes couleurs disponibles :

noir            0;30    gris foncé gras         1;30
rouge           0;31    rouge gras              1;31
vert            0;32    vert gras               1;32
jaune           0;33    jaune gras              1;33
bleu            0;34    bleu gras               1;34
magenta         0;35    magenta gras            1;35
cyan            0;36    cyan gras               1;36
blanc           0;37    blanc gras              1;37

Augmenter la taille de l'historique du shell

La capacité de l'historique de Bash est définie par deux variables d'environnement : $HISTSIZE et $HISTFILESIZE ; la première indique combien de commandes sont mises en mémoire à l'ouverture de la session ainsi que combien seront enregistrées dans l'historique à sa fermeture, et la deuxième combien d'entrées l'historique peut contenir au maximum (par défaut : 500).

HISTSIZE=1000
HISTFILESIZE=50000

Horodater l'historique des commandes

La commande history vous permet d'afficher l'historique des commandes exécutées dans le shell, mais par défaut elle n'affiche pas la date et encore moins l'heure à laquelle ces commandes ont été exécutées. Pour horodater cet historique, utilisez la variable d'environnement $HISTTIMEFORMAT :

export HISTTIMEFORMAT="%d/%m/%Y %H:%M:%S "

À partir de maintenant, votre historique sera horodaté (les entrées dans le fichier .bash_history sont préfixées d'un timestamp UNIX), et l'output de la commande history ressemblera à ça :

marc@oxide:~% history | tail -n 5
   27  08/05/2009 12:29:15 uname -a 
   28  09/05/2009 12:29:45 cd /tmp
   29  09/05/2009 12:29:46 ls 
   30  09/05/2009 12:30:05 cd ..
   31  09/05/2009 12:30:20 history | tail -n 5

Consultez la page de manuel strftime(3) pour toute référence aux options de formatage disponibles.

Réutilisation de commandes avec substitution

Pour ré-exécuter la commande précédente en changeant quelques paramètres, utilisez l'history expansion de Bash :

shell:~$ !!:gs/ancienparamètre/nouveauparamètre/

L'history expansion de Bash est très puissante, et la section du man qui la documente est à cette image : copieuse. Pour la petite histoire, !! signifie qu'on réfère à la ligne d'historique précédente — c'est à dire, la ligne de commande exécutée juste avant —, :g signifie qu'on applique la substitution à toute la ligne de commande (par défaut, seul la première occurrence est substituée) et enfin le mondialement connu s/foo/bar/ qui demande la substitution de "foo" par "bar".

Réutiliser certains paramètres de lignes de commande antérieures

Dans le même registre que l'astuce précédente il est possible de réutiliser uniquement certains paramètres de commandes précédemment exécutées, toujours grâce à la fonctionnalité d'history expansion. Démonstration attention :

shell:~$ mkdir a b c d
shell:~$ rmdir !:2-3       <= on réutilise uniquement le 2ème et 3ème paramètre de la commande précédente, soit "b" et "c"
rmdir b c
shell:~$ ls
a  d
shell:~$

Là encore, je vous renvoie vers le man de Bash, section "HISTORY EXPANSION" pour une référence exhaustive de la syntaxe.

Logger (élégamment) les messages d'erreur d'un script Bash

Bien qu'il soit possible de rediriger les messages d'erreur au moment de l'exécution d'un script (du genre script.sh 2>erreurs.log par exemple), il est possible de faire cela plus proprement depuis le script :

exec 3>/tmp/monscript-erreurs.log
exec 2>&3

...
exit 0

Basiquement, on déclare un descripteur de fichier supplémentaire qui pointe vers un fichier /tmp/monscript-erreurs.log et on redirige la sortie STDERR vers ce nouveau descripteur.

Utiliser une commande aliasée "nature"

Vous vous êtes mitonné un .bash_aliases aux petits oignons avec tout plein d'alias pour vous faciliter la vie, et c'est très bien. Mais comment faites-vous le jour où vous avez justement besoin d'utiliser une de ces commandes sans les paramètres de l'alias ? Devez-vous supprimer cet alias le temps d'exécuter votre commande et ensuite le recréer ? Noooonnnn, il suffit d'invoquer la commande précédée d'un antislash pour inhiber temporairement l'alias et ainsi appeler la commande "au naturel" :

marc@chorizo:~% du mon_fichier 
6420    mon_fichier
marc@chorizo:~% alias du='du -h'
marc@chorizo:~% du mon_fichier 
6.3M    mon_fichier
marc@chorizo:~% \du mon_fichier 
6420    mon_fichier

Invoquer temporairement un éditeur de texte pour rédiger une ligne de commande longue/complexe

Si vous avez à écrire une ligne de commande particulièrement longue et/ou complexe, sachez qu'il est possible d'invoquer temporairement l'éditeur de texte de votre choix (Emacs, Vi[m], Joe...) pour écrire ladite ligne de commande avec tout le confort que peut vous apporter cet éditeur. Pour ce faire, assurez-vous que la variable d'environnement $EDITOR est bien définie au nom du binaire de votre éditeur favori, et exécutez la combinaison de touches suivante :

$ Ctrl-x Ctrl-e

Votre éditeur de texte d'ouvrira sur un document vierge dans lequel vous pouvez prendre le temps de confectionner votre ligne de commande, cette dernière sera exécutée par le shell après que vous ayez enregistré/quitté l'éditeur.

Empêcher Bash de logger les commandes exécutées dans l'historique

Dans le cas où vous auriez besoin de tester quelques lignes commandes faisant apparaitre des informations sensibles (typiquement, un mot de passe), exécutez au préalable la commande suivante pour rendre Bash amnésique pour la durée de la session :

unset HISTFILE

docs.soolbox.net: SysadminTips/Bash (last edited 2010-06-02 08:44:16 by MarcFalzon)