Bash
Contents
-
Bash
- Raccourcis clavier
-
Astuces
- Changer la forme et la couleur du prompt (invite de commande)
- Augmenter la taille de l'historique du shell
- Horodater l'historique des commandes
- Réutilisation de commandes avec substitution
- Réutiliser certains paramètres de lignes de commande antérieures
- Logger (élégamment) les messages d'erreur d'un script Bash
- Utiliser une commande aliasée "nature"
- Invoquer temporairement un éditeur de texte pour rédiger une ligne de commande longue/complexe
- Empêcher Bash de logger les commandes exécutées dans l'historique
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