web-dev-qa-db-fra.com

Avec BASH après "défilement" jusqu'à une commande précédente ... comment passer ensuite à la suivante dans cette histoire?

Toutes mes excuses, ce titre n'est pas le plus élégant que j'aie jamais imaginé.

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

Quand je dis "faire défiler" vers le haut, je veux dire utiliser la touche "flèche vers le haut" du clavier, qui vous fait évidemment défiler vers le haut dans 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 puis vous voulez exécuter la commande qui est venue après elle ... y a-t-il un moyen rapide de le faire? Ou comment font ceux qui parlent couramment BASH?

59
mike rodent

Exécution de la commande avec Ctrl+o au lieu de Enter exécutera une commande à partir de l'historique, puis mettra en file d'attente la suivante au lieu de revenir au début de l'historique bash.

97
Jon Reinhold

La réponse de Jon Reinhold est excellente, mais il y a une solution beaucoup plus puissante que je proposerai. J'ai également un commentaire sur 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 fc, qui 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 que vous voudrez peut-être faire est d'ajouter à tout sauf à la dernière ligne quelque chose comme "; lire -p" suivant ... ". Cela fera en sorte que bash exécute chaque ligne et vous invite avant de continuer.

Commentaire pour Jon Reinhold: Excellente réponse, mais vous devez la qualifier car si l'utilisateur a défini la variable bash HISTCONTROL pour inclure erasedups, puis après avoir effectué C-o l'utilisateur sera confus car au lieu de la prochaine commande attendue dans l'historique affichée, celle qui suit sera affichée. C'est parce que bash a supprimé l'instance d'origine de la commande exécutée, et donc toutes les commandes ont ensuite remonté d'une ligne, c'est-à-dire. à un numéro d'index inférieur dans la liste d'historique.

19
user1404316

Une autre façon d'accomplir le comportement souhaité serait de vous familiariser avec les raccourcis bash readline (dont CTRL-o est celui que je crois) et bash recherche d'histoire.

Recherche historique

CTRL-r vous emmène dans la recherche de l'historique des commandes bash, où vous pouvez commencer à taper la commande que vous recherchez et bash terminera 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 d'entrée, vous pouvez ENTER pour exécuter la commande, o appuyez sur CTRL-e pour déplacer le curseur à la fin de la ligne de commande et quitter le mode de recherche d'historique.

La chose cool avec CTRL-e à ce stade, le tampon d'historique est défini contextuellement à 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 vous a localisée. Vous pouvez appuyer sur les flèches haut ou bas et saisir la commande suivante.

La recherche d'historique est très puissante et un excellent moyen d'éviter d'utiliser la flèche vers le haut pour revenir à la commande en premier lieu. Une recherche rapide dans l'historique peut vous faire gagner beaucoup de temps en recherchant manuellement dans l'historique et ensuite vous pouvez continuer CTRL-o comme Jon l'a souligné ci-dessus.

Readline Short Cuts

Si vous cherchez à augmenter votre bash-fu global, je recommanderais de donner un coup de pouce aux raccourcis de la ligne de lecture pour les touches fléchées. Vous trouverez peut-être qu'ils sont plus pratiques et vous permettent d'augmenter votre vitesse de frappe, mais bien sûr YMMV. En voici quelques autres:

  1. CTRL-n pour la commande suivante (équivalent flèche vers le bas)
  2. CTRL-p pour la commande précédente (équivalent flèche haut)
  3. CTRL-b sauvegarder un caractère (équivalent flèche gauche)
  4. CTRL-f transmettre un caractère (équivalent flèche droite)

Ces raccourcis de ligne de lecture (avec CTRL-a début de ligne et CTRL-e fin de ligne) augmentera votre vitesse et votre efficacité sur la ligne de commande imo.

15
111---