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

146

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 flèche vers le haut, il me montrer: ./script.pl arg1. Appuyez de nouveau dessus et ça se verrait ./script.pl, etc.

Très bien, il serait effectuer une grep.bash_history. Y at-il un moyen d'obtenir cette fonctionnalité?

TLP
la source
doublon possible de l' historique des commandes
Marcel Stimberg le
1
@Marcel On dirait que c'est peut-être la même réponse, c'est ce que j'ai vu dans la recherche, mais je ne l'ai pas connectée à ma question, avec les mots clés iPython et Shell.
TLP
Cela ressemble à ceci - github.com/zsh-users/zsh-autosuggestions .
slm

Réponses:

197

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. ~/.inputrcest le fichier de configuration pour readline. Notez que cela s'appliquera également à d'autres logiciels utilisant la bibliothèque readline, par exemple IPython .

Lisez le manuel de bash pour plus d’informations sur readline. Vous y trouverez également d'autres commandes readline liées à l'historique .

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

  1. Commencez catdans un terminal (juste cat, pas d'autres arguments).
  2. Tapez les touches sur le clavier, vous obtiendrez des choses comme ^[[Apour la flèche vers le haut et ^[[Bpour la flèche vers le bas.
  3. Remplacer ^[par \e.
lesmana
la source
1
Bien, mais cette solution désactive les raccourcis ctrl-gauche / ctrl-droite.
Eyal
Quelqu'un peut-il me dire comment puis-je obtenir la même chose pour la marque?
Hitesh Kumar 10/02/2017
@lesmana, je donnerais des points supplémentaires pour la partie chat seul
Mike D
Appuyant @Eyal, tout le monde a des conseils sur la manière de procéder, tout en préservant les raccourcis ctrl-gauche / ctrl-droite?
kbrose
6
Pour conserver tous les paramètres par défaut, ajoutez $include /etc/inputrc, de préférence sur la première ligne.
Tulio Casagrande
31

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!

utilisateur287613
la source
4
Bizarrement, le ~ / inputrc ne fonctionnait pas pour moi - mais mettre ces commandes dans .bash_profile le faisait.
Joe
1
Le fichier .inputrc n’existe pas dans mon dossier personnel et, de toute façon, je préfère avoir ce type de paramètres dans .bashrc pour pouvoir transporter un fichier à la place. C'est donc probablement une meilleure réponse que celle acceptée.
Shital Shah
.inputrc fonctionne à merveille pour moi, mais pas après le chargement screen. Ce qui est étrange, c’est que d’autres raccourcis .inputrc fonctionnent, mais pas ceux-là. Donc, j'utilise les deux solutions maintenant.
Orwellophile
Ceci est extrêmement utile lorsque, par exemple, vous vous connectez à un serveur pour faire des choses et que vous en manquez le diable et que vous ne voulez pas éditer et recharger le fichier ~ / .inputrc sur le serveur.
danmactough
13

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

Andrew Moss
la source
2
Merci pour votre réponse. Oui, j'ai essayé ça, mais je trouve ça un peu ... capricieux. Cela ne me permettra pas de faire défiler les commandes commençant par le partiel, il ne montre que les premières. Il recherche également le caractère dans toute la commande, ce qui est en quelque sorte inutile.
TLP
5
@TLP, répéter frapperCtrl+r
akostadinov
4

Pour compléter la réponse de lesmana concernant "~ / .inputrc" que je devrais créer sous mon 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 .

bcag2
la source
2
Cette commande indique en gros à bash d’ajouter immédiatement la commande au fichier historique au lieu d’attendre la fin de la session. C'est utile si vous avez beaucoup de terminaux ouverts et que vous ne voulez pas perdre votre historique, mais que ce n'est pas nécessaire. digitalocean.com/community/tutorials/…
Shital Shah
3

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

entrez la description de l'image ici

Il peut être facilement lié à Ctrl-ret / ouCtrl-s

Martin Dvorak
la source
0

La solution suivante combine et étend certaines des approches mentionnées ci-dessus: ajoutez les lignes suivantes à votre ~/.bash_aliasesfichier (inutile de le faire ~/.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-le source ./bash_aliases) pour appliquer les modifications.

utilisateur27164
la source