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.
Pour régler ces 2 problèmes, il suffit de faire appel à la variable d'environnement HISTCONTROL qui peut exclure certaines commandes en fonction du pattern stipulé. Cette variable peut être exportée en ligne de commande, mais le mieux c'est tout de même de la définir dans le ~/.bashrc, afin qu'elle soit initialisée à chaque reconnexion :
export HISTCONTROL=ignorespace:ignoredups
ignorespace 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 cmdhist
Et 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}    "

En bref

On vient juste de brosser un premier plan de Bash et déjà on peut quasiment refaire le monde ! Car oui, si c'est l'outil qui vous permet de manipuler d'autres outils et qui date tout de même, il n'empêche qu'il est puissant et regorge de multiples fonctionnalités. En tout cas, si vous voulez aller plus loin, rien ne vaut le man ! Après, il n'y a pas que bash : zsh, ksh, csh, bref de quoi jouer ! Enjoy !
Vus : 1727
Publié par K-Tux : 59