С BASH после «прокрутки» до предыдущей команды… как перейти к следующему в этой истории?

59

Извините, этот заголовок не самый элегантный, который я когда-либо придумывал.

Но я предполагаю, что многие люди будут удивлены этим, и мой вопрос может быть обманом ... все, что я могу сказать, я не нашел это.

Когда я говорю «прокрутка» вверх, я имею в виду использование клавиши «стрелка вверх» на клавиатуре, которая, очевидно, прокручивает вас по истории, начиная с самой последней команды.

Таким образом, вы находите команду, может быть, 30 команд назад ... и запускаете ее. И затем вы хотите запустить команду, которая первоначально пришла после нее ... Есть ли быстрый способ сделать это? Или как те, кто свободно говорит на BASH, делают это?

Майк Грызун
источник

Ответы:

96

Выполнение команды с Ctrl+ oвместо Enterзапускает команду из истории, а затем ставит в очередь следующую, а не возвращается в начало истории bash.

Джон Рейнхольд
источник
2
Я только что попробовал это в моем собственном bash, запущенном в xterm на NetBSD, и это не работает! Есть ли настройки, которые могут повлиять на это? У меня нет файла .inputrc. Co не упоминается на странице руководства для readline (3).
Риальто
@Rhialto Используете ли вы viредактирование строки (с помощью set -o vi) или emacs? Потому Ctrl-Oчто не буду работать с первым, насколько я могу судить.
B Layer
... но это может быть исправлено с помощью команды: bind "\C-o":operate-and-get-next(или добавить все после того, как bindк ~/.inputrc)
B уровня
1
Я выяснил, в чем заключается моя проблема: ^ O принимается за символ Flush Output (не поддерживается в Linux), и readline не отключает его, пока он активен. Я поставил простой патч, но сопровождающий bash и readline утверждает, что это не ошибка. Я не согласен. См. Lists.gnu.org/archive/html/bug-readline/2018-01/msg00004.html
Rhialto
19

Ответ Джона Рейнхолда великолепен, но я предлагаю гораздо более мощное решение. У меня также есть комментарий о гоче в ответе Джона, но у меня недостаточно репутации, чтобы иметь возможность комментировать напрямую, поэтому @Jon Reinhold, если вы прочитаете это, пожалуйста, отправьте мой комментарий ниже.

Bash включает команду fc, которая принимает в качестве параметров номера строк списка истории bash. Затем он открывает редактор по умолчанию с этими строками в виде текста. В этот момент вы можете при желании редактировать строки. Затем, когда вы выходите из редактора, bash выполняет эти строки!

Примером редактирования, которое вы, возможно, захотите сделать, является добавление ко всем, кроме последней строки, что-то вроде "; read -p" next ... ". Это заставит bash выполнить каждую строку и запросит вас, прежде чем продолжить.

Комментарий для Джона Рейнхольда: отличный ответ, но вы должны его квалифицировать, потому что если пользователь установил переменную bash HISTCONTROL для включения erasedups, то после выполнения C-oпользователь будет сбит с толку, поскольку вместо ожидаемой следующей команды в отображаемой истории, той, которая после этого будет отображаться. Это связано с тем, что bash удалил исходный экземпляр выполненной команды, и, следовательно, все команды впоследствии сместились на одну строку вверх, т.е. на один меньший индекс в списке истории.

user1404316
источник
спасибо, пытаясь найти ответ с помощью поиска, я наткнулся на команду "fc". Для меня это представляет собой следующую стадию в медленном шаге младенца неофита BASH по пути славы к ЗНАНИЮ. Я хотел первый шаг ребенка.
Майк Грызун
3
@mikerodent Нет . Так что это происходит fcеще до как Ctl-oи bashсам. (Вопреки этому ответу это также менее полезно.)
kubanczyk
1
Проблема с erasedupsявно ошибкой bash ( в этой ситуации могли быть условия). Приятно знать, хотя.
Алексис
2
@kubanczyk Это до дебатов. Если это сложная, сложная команда, в зависимости от того, что нужно исправить, для меня было бы гораздо быстрее использовать выбранный мной редактор для обновления команды. Это также было бы проще.
Прифтан
14

Другой способ добиться желаемого поведения было бы ознакомиться с ярлыками Баша (чтение строки из которых CTRL- oэто один я считаю) и история Баша поиском.

История поиска

CTRL- rвводит вас в поиск истории команд bash, где вы можете начать вводить команду, которую вы ищете, и bash автоматически выполнит команду за вас. Функциональность автозаполнения действительно очень хорошая. Когда команда, которую вы хотите выполнить, находится в строке ввода, вы можете ENTERзапустить команду или нажать CTRL-, eчтобы переместить курсор в конец командной строки и выйти из режима поиска истории.

Крутая вещь с CTRL- eна этом этапе, что буфер истории установлен контекстно для этой команды. Следующие и предыдущие команды теперь выполняются непосредственно перед и после строки, в которой находился поиск по истории. Вы можете нажать стрелки вверх или вниз и получить следующую команду.

Поиск в истории очень мощный и отличный способ избежать использования стрелки вверх, чтобы сначала вернуться к команде. Быстрый поиск по истории может сэкономить много времени при ручном поиске по истории, а затем вы можете продолжить CTRL- oкак указал Джон выше.

Readline Short Cuts

Если вы ищите общий bash-fu, я бы порекомендовал дать ярлык readline для клавиш со стрелками. Вы можете обнаружить, что они более удобны и позволяют увеличить скорость печати, но, конечно, YMMV. Вот еще несколько:

  1. CTRL- nдля следующей команды (эквивалент стрелки вниз)
  2. CTRL- pдля предыдущей команды (эквивалент стрелки вверх)
  3. CTRL- bвернуть символ (эквивалент стрелки влево)
  4. CTRL- fпереслать символ (эквивалент стрелки вправо)

Эти ярлыки readline (наряду с CTRL- aначало строки и CTRL- eконец строки) увеличат вашу скорость и эффективность в командной строке imo.

111 ---
источник
2
Я не знаю. Я считаю, что использование клавиш-модификаторов медленнее, чем стрелок или нажатие любой другой клавиши. Что касается EOL / и т.д. Я склонен использовать клавиши home / end (конечно, stty -a также показывает некоторые полезные вещи).
Прифтан
@Pryftan Справедливо, последнее предложение представлено как мнение (см. «IMO»). Я действительно считаю, что длительное пребывание на домашнем ряду клавиатуры - это хорошая стратегия для работы в терминале или любых других интенсивных задач. У некоторых людей есть клавиатуры, где клавиши со стрелками ближе к другим символам, в этом случае, возможно, ярлыки readline не являются неоспоримым удобством. Я отредактирую ответ, чтобы сделать этот последний пункт более четким высказыванием мнения.
111 ---
1
@datUser Tbh ​​Я пропустил «IMO» (или, если я не сделал, я не учел это - вполне возможно). Правда, обратный поиск полезен (есть +1), если он работает для вас. Конечно, fc также является чем-то (как уже отмечалось) и поэтому использует! (и т.д.). Множество способов шкурить кошку в Unices. Что касается клавиатур, то это также верно: у меня есть клавиатура Unicomp (она мне нравится и возвращает воспоминания), но, конечно, есть и другие клавиатуры, на которые стоит обратить внимание, не говоря уже о Dvorak. В конце концов, чем больше вариантов у вас есть, тем лучше вы выходите и тем легче ваша работа (или игра) :)
Pryftan