web-dev-qa-db-fra.com

Recherche dans l'historique Bash, partielle + flèche vers le haut

J'ai cherché, mais rien trouvé à ce sujet. Je cherche une fonctionnalité en bash, en utilisant un terminal.

Il y a bien longtemps, j'avais un utilisateur sur un système Debian et un ami m'a configuré avec une fonction de recherche historique pratique (je crois avoir utilisé tcsh à l'époque), où je taperais le début d'une commande précédente, en appuyant sur la flèche vers le haut, et il ferait une recherche, basée sur la chaîne partielle.

Par exemple. si mon histoire est:

./script.pl
./script.pl arg1
cat output
cat output | grep yada

Et je tape ., et appuyez sur la flèche vers le haut, il me montrerait: ./script.pl arg1. Appuyez de nouveau dessus pour afficher ./script.pl, etc.

Cela ressemble beaucoup à un grep sur .bash_history. Y at-il un moyen d'obtenir cette fonctionnalité?

143
TLP

Mettez les lignes suivantes dans votre ~/.inputrc:

## arrow up
"\e[A":history-search-backward
## arrow down
"\e[B":history-search-forward

Les lignes commençant par # sont des commentaires. Je ne me souviens pas de ce qui est en arrière et de ce en avant. Expérimentez avec. Peut-être que vous devez basculer en arrière et en avant.


Un peu d'information de base:

Bash utilise readline pour gérer l'invite. ~/.inputrc est le fichier de configuration pour readline. Notez que cela prendra également effet dans les autres logiciels utilisant la bibliothèque readline, par exemple IPython .

Lisez le manuel bash pour plus d'informations sur readline. Là vous pouvez aussi trouver plus commandes reliées à l'historique .

Pour obtenir les codes d'échappement des touches de direction, vous pouvez effectuer les opérations suivantes:

  1. Démarrez cat dans un terminal (juste cat, aucun autre argument).
  2. Tapez les touches sur le clavier, vous obtiendrez des éléments tels que ^[[A pour la flèche vers le haut et ^[[B pour la flèche vers le bas.
  3. Remplacez ^[ par \e.
193
lesmana

Créez un fichier nommé setup_readline.sh avec le mode 644 dans /etc/profile.d/ avec le contenu suivant, connectez-vous et vérifiez vos clés préférées:

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'

Je pense que c'est le meilleur moyen de le faire. Principalement si vous utilisez des systèmes de gestion de la configuration tels que chef, marionnette, etc.

Et la configuration du système reste intacte!

30
user287613

Ctrl + R vous donnera ce genre de fonctionnalité. Commencez à taper une commande partielle et elle viendra avec les anciennes avec lesquelles vous pourrez naviguer avec les flèches haut et bas. Plus d'infos: http://www.nuxified.org/blog/ctrl_r_in_the_bash_Shell

12
Andrew Moss

Pour compléter la réponse de lesmana concernant "~/.inputrc" que je devrais créer sous Trusty 14.04, vérifiez/ajoutez "~/.bashrc" (la première ligne existe déjà dans mon "~/.bashrc"):

shopt -s histappend  
Prompt_COMMAND='history -a'  

C'est déjà expliqué en français dans https://doc.ubuntu-fr.org/terminal?&#pour_completer_les_commandes_a_partir_de_l_historique .

4
bcag2

Vous voudrez peut-être essayer https://github.com/dvorka/hstr , qui fournit un filtrage simple et multiligne de l’historique Bash basé sur une métrique (quand, combien de fois et la durée de commandes importe) - vous pouvez utiliser les touches fléchées pour naviguer facilement dans l'historique:

enter image description here

Il peut être facilement lié à Ctrl-r et/ou Ctrl-s

2
Martin Dvorak

La solution suivante combine et étend certaines des approches mentionnées ci-dessus: ajoutez les lignes suivantes à votre fichier ~/.bash_aliases (inutile de ~/.inputrc) pour obtenir le comportement suivant:

  1. monter/descendre dans l'historique (uniquement les entrées avec le même préfixe) en appuyant sur CTRL + HAUT et CTRL + BAS. Cela peut coexister avec la fonctionnalité standard consistant à monter/descendre dans l'historique complet via UP et DOWN uniquement
  2. passer au mot suivant/précédent dans une ligne de commande en appuyant sur CTRL + DROITE et CTRL + GAUCHE
bind '"\e[1;5A":history-search-backward'
bind '"\e[1;5B":history-search-forward'
bind '"\e[1;5C":forward-Word'
bind '"\e[1;5D":backward-Word'

Reconnectez-vous au shell (ou exécutez source ./bash_aliases) afin d'appliquer les modifications.

0
user27164