Back To Basis : Bash tips
Bonjour à tous !
Un petit retour sur un outil qui sert tous les jours, j'ai nommé : Bash ! Et notamment, tout ce qui tourne autour de son historique, histoire de ne pas se répéter plein de fois :)
History et manips en ligne de commande
Qui ne connait pas la commande history ! Elle vous affiche ce que vous avez rentré en ligne de commande. Et malgré les apparences, cela permet d'appeler ces commandes sans avoir à -totalement- se les retaper (et non, je ne parle pas du click molette :). Mais vous allez voir, on peut faire beaucoup plus de choses !Manips usuelles
- !cmd : rappelle la dernière instance de cmd que vous avez appelé. Exemple : !mou me rappelera mon dernier mount. Et oui, c'est une recherche de chaine de caractère donc pas la peine de tout taper !
- !2 : rappelle la seconde commande, celle inventoriée avec le numéro d'index 2 lorsque que l'on lance un history.
- !-2 : avant dernière commande cette fois.
- sudo !! : sudo est concaténé avec la commande précédente. Bon, ça fonctionne aussi avec d'autres instructions :)
- ctrl -r : permet de rechercher un motif dans notre historique
- !!:$ : désigne le dernier argument de la dernière commande. Equivalent à
!$
.
Manips sur l'history
- history -c : clear de l'history
- history -d offset : clear de l'history à partir de l'offset spécifié
- history -r filename : récupère l'historique de filename et le stocke afin qu'il soit accessible en ligne de commande. Si filename n'est pas donné, c'est le contenu de la variable d'environnement HISTFILE qui est utilisé.
- history -w filename : écrit l'historique actuel dans filename. Même comportement que -r si filename n'est pas mentionné.
- history -s cmd : va mettre cmd enqueue dans l'history sans l'exécuter réellement,
History et config
L'historique du bash est stocké sous ~/.bash_history. D'où 2 problématiques :- la confidentialité de l'historique, puisque par défaut au moins accessible à tous les root,
- la redondance inutile d'infos : par exemple on peut rentrer 20 fois la commande ls, sans pour autant que celle-ci n'ait d'intérêt à être enregistrée 20 fois telle quelle.
export HISTCONTROL=ignorespace:ignoredupsignorespace va ignorer toute commande invoquée mais derrière un espace, tandis qu'ignoredups va ignorer tout duplicata de commande déjà enregistrée. Un truc sympa aussi, c'est d'ignorer les mises en foreground/background (&:[bf]g), les ls et les exit (ls:exit) :
export HISTIGNORE="&:ls:[bf]g:exit"
Stockage des commandes multilignes sur une seule
Une autre option du Bash qui n'est pas forcément activée par défaut et cmdhist. Ça permet notamment quand elle est activée de stocker sur une ligne les commandes s'étalant sur plusieurs. Activation de l'option :shopt -s cmdhistEt désactivation :
shopt -u cmdhist
Vérification avant passage au bash
Encore une option qui peut potentiellement vous sauver de la catastrophe : histverify. Cela permet de ne pas passer tout de suite la commande à Bash mais de passer par un print et donc de pouvoir corriger si la commande n'est pas correcte ou pire, dangereuse :) Un rm -rf par exemple... Idem que cmdhist, pour lactiver, il faut passer par shopt.Retouches
Il est possible de sélectionner et de retoucher un panel de commande de l'historique grâce à fc (Fix Command).- fc [-e ename] [-lnr] [first] [last] : sur un éventail de commande allant de [first] à [last], tout deux pouvant être la commande écrite ou son index de l'historique, faire un listing :
- -l : normal,
- -n : sans le numéro d'index, histoire de récupérer la suite d'instruction et de la rejouer automatiquement par exemple,
- -r : inversé par rapport à l'ordre originel d'invocation de ces commandes
- -e ename : stipule explicitement quel éditeur utiliser, vi étant le défaut.
- fc -s [command] : réexecute la commande stipulée, à défaut la dernière effectuée.
Paramétrage de l'historique
Evidemment, l'historique est soumis à des contraintes de taille au niveau des commandes mais aussi au niveau du fichier contenant le tout. Et bien entendu, ceci est modifiable : Bienvenue sous Linux !- HISTSIZE : le nombre de commandes retenues, par défaut 500.
- HISTFILESIZE : nombre maximum de ligne contenue dans le ~/.bash_history. Defaut : 500.
- HISTCONTROL : vu précédemment, module l'enregistrement des commandes
- HISTTIMEFORMAT : si définie, permet de stipuler le format du timestamp associé à chaque commande, qui sera du coup affiché lors de l'invocation d'history. Très pratique pour tracer les manips, et surtout quand elles ont été faites ! Exemple, dans le ~/.bashrc :
CYAN=$(echo -e '\\e[0;36m') NORMAL=$(echo -e '\\e[0m') HISTTIMEFORMAT="${CYAN}[ %d/%m/%Y %H:%M:%S ]${NORMAL} "