Avec BASH après avoir «fait défiler» une commande précédente… comment passer à la suivante dans cet historique?

59

Toutes mes excuses, ce titre n'est pas le plus élégant que j'ai jamais conçu.

Mais je suppose que beaucoup de gens se seront demandé cela, et ma question est peut-être une dupe ... tout ce que je peux dire, c'est que je ne l'ai pas trouvée.

Quand je parle de "défilement", je parle de la touche "Flèche haut" du clavier, qui vous permet de faire défiler l'historique, en commençant par la commande la plus récente.

Donc, vous trouvez une commande peut-être 30 commandes en arrière ... et vous l'exécutez. Et ensuite, vous voulez exécuter la commande qui l’a été à l’origine. Y at-il un moyen rapide de le faire? Ou comment ceux qui parlent couramment BASH font-ils cela?

Mike Rongeur
la source

Réponses:

96

L'exécution de la commande avec Ctrl+ oau lieu de Enterexécutera une commande de l'historique, puis mettra en file d'attente la suivante au lieu de revenir au début de l'historique bash.

Jon Reinhold
la source
2
Je viens d’essayer cela dans mon propre compte-rendu d’exécution sur xBS sur NetBSD, et cela ne fonctionne pas! Y at-il des paramètres qui peuvent influencer cela? Je n'ai pas de fichier .inputrc. Co n'est pas mentionné dans la page de manuel de readline (3).
Rhialto
@Rhialto Utilisez-vous l' viédition en ligne (activée avec set -o vi) ou emacs? Parce Ctrl-Oque ne travaillera pas avec l'ancien, autant que je sache.
Couche B
... mais cela peut être résolu avec la commande: bind "\C-o":operate-and-get-next(ou ajouter tout ce qui suit bindà ~/.inputrc)
B couche
1
J'ai découvert la nature de mon problème: ^ O est considéré comme le caractère de sortie de vidage (non pris en charge sous Linux), et readline ne le désactive pas tant qu'il est actif. J'ai fourni un correctif simple mais le mainteneur bash et readline maintient qu'il ne s'agit pas d'un bogue. Je ne suis pas d'accord. Voir lists.gnu.org/archive/html/bug-readline/2018-01/msg00004.html
Rhialto le
19

La réponse de Jon Reinhold est excellente, mais je proposerai une solution beaucoup plus puissante. J'ai aussi un commentaire à propos d'un piège dans la réponse de Jon, mais je n'ai pas assez de réputation pour pouvoir commenter directement, alors @ Jon Reinhold, si vous lisez ceci, veuillez vous adresser mon commentaire ci-dessous.

Bash inclut une commande fcqui prend comme paramètres les numéros de ligne de la liste d'historique bash. Il ouvre ensuite votre éditeur par défaut avec ces lignes sous forme de texte. À ce stade, vous pouvez éventuellement modifier les lignes. Ensuite, lorsque vous quittez l'éditeur, bash exécute ces lignes!

Un exemple de modification à effectuer est d'ajouter à la dernière ligne quelque chose du type "; read -p" next ... ", à l'exception de la dernière ligne.

Commentaire pour Jon Reinhold: Excellente réponse, mais vous devez le qualifier, car si l'utilisateur a défini la variable bash HISTCONTROL comme élément à inclure erasedups, il C-osera confus après l'exécution, car au lieu de la commande suivante attendue dans l'historique, sera affiché. En effet, bash a supprimé l’instance originale de la commande exécutée et toutes les commandes ont ensuite été décalées d’une ligne, c’est-à-dire. à un numéro d'index inférieur dans la liste d'historique.

utilisateur1404316
la source
merci, en essayant de trouver la réponse en cherchant j'ai trouvé la commande "fc". Pour moi, cela représente la prochaine étape de la lenteur du bébé d'un néophyte BASH sur le chemin de la gloire vers la CONNAISSANCE. Je voulais le premier pas de bébé.
Mike Rongeur
3
@mikerodent Non. Donc, cela arrive fcavant les deux Ctl-oet bashlui - même. (Contrairement à cette réponse, il est également moins utile.)
kubanczyk
1
Le problème avec erasedupsest clairement un bug bash (il aurait pu être prévu pour cette situation). Bon à savoir, cependant.
alexis
2
@kubanczyk C'est à débattre. S'il s'agit d'une commande complexe et compliquée selon ce qui doit être corrigé, il serait beaucoup plus rapide pour moi d'utiliser l'éditeur de mon choix pour mettre à jour la commande. Ce serait aussi plus facile.
Pryftan
14

Une autre façon d’obtenir le comportement souhaité est de se familiariser avec les raccourcis bash readline (dont CTRL, oje crois) et la recherche dans l’historique bash.

Recherche historique

CTRL- rvous emmène dans la recherche de l'historique des commandes bash, où vous pouvez commencer à taper la commande que vous recherchez et bash complétera automatiquement la commande pour vous. La fonctionnalité de saisie semi-automatique est vraiment très bonne. Lorsque la commande que vous souhaitez exécuter se trouve sur la ligne de saisie, vous pouvez ENTERexécuter la commande ou appuyer sur CTRL- epour déplacer le curseur à la fin de la ligne de commande et quitter le mode de recherche dans l'historique.

La chose intéressante avec CTRL- eà ce stade, c’est que le tampon d’historique est paramétré de manière contextuelle pour cette commande. Les commandes suivantes et précédentes sont maintenant celles exécutées juste avant et après la ligne que la recherche d’historique a localisée pour vous. Vous pouvez appuyer sur les flèches haut ou bas et saisir la commande suivante.

La recherche dans l'historique est très puissante et constitue un excellent moyen d'éviter d'utiliser la flèche dirigée vers le haut pour revenir à la commande en premier lieu. Une recherche rapide dans l’historique peut vous faire gagner beaucoup de temps et vous permet de poursuivre CTRL, ocomme l’a souligné Jon ci-dessus.

Readline Short Cuts

Si vous cherchez à améliorer votre bash-fu en général, je vous conseillerais de donner un coup de pouce aux raccourcis de lecture pour les touches de direction. Vous constaterez peut-être qu’ils sont plus pratiques et vous permettent d’accroître votre vitesse de frappe, mais bien sûr, YMMV. Voici quelques autres:

  1. CTRL- npour la commande suivante (équivalent flèche bas)
  2. CTRL- ppour la commande précédente (équivalent flèche haut)
  3. CTRL- bsauvegarder un personnage (équivalent de la flèche gauche)
  4. CTRL- ftransférer un caractère (équivalent de la flèche droite)

Ces raccourcis readline (ainsi que CTRL- adébut de la ligne et CTRL- efin de ligne) augmentera votre vitesse et de l' efficacité à la ligne de commande imo.

111 ---
la source
2
Je ne sais pas. Je trouve l'utilisation des touches de modification plus lente que celle des flèches ou de toute autre pression sur une touche. En ce qui concerne EOL / etc. J'ai tendance à utiliser les touches home / end (stty -a montre bien sûr des choses très utiles).
Pryftan
@Pryftan Assez, la dernière phrase est présentée comme une opinion (voir 'imo'). Je pense que rester sur la ligne principale du clavier sur le long terme est une bonne stratégie pour travailler dans le terminal ou pour toute autre tâche de saisie intensive. Certaines personnes ont des claviers où les touches fléchées sont plus proches des autres caractères. Dans ce cas, les raccourcis readline ne sont peut-être pas pratiques. Je vais modifier la réponse pour que ce dernier point soit plus clairement un avis.
111 ---
1
@datUser Tbh ​​J'ai raté le "imo" (ou si je ne l'avais pas fait, j'ai négligé de le considérer - tout à fait possible). Ce qui est vrai, c’est que la recherche inversée est utile (utilisez un +1) si cela vous convient. Bien sûr, fc est aussi quelque chose (comme déjà noté) et utilise donc! (etc.). Beaucoup de façons de peler un chat dans Unices. En ce qui concerne les claviers, c’est également vrai: j’ai un clavier Unicomp (l’aime et me rappelle des souvenirs), mais bien sûr, il existe également d’autres claviers à considérer, sans parler de Dvorak. En fin de compte, plus vous avez d'options, mieux vous êtes et plus votre travail (ou votre jeu) est facile :)
Pryftan