Bash: выберите предыдущую команду, которая соответствует шаблону - PullRequest
3 голосов
/ 20 марта 2009

Я знаю о навигации по истории bash со стрелками вверх и вниз.

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

Возможно ли это с bash?

Если нет, есть ли у других оболочек такая функция?

Ответы [ 3 ]

4 голосов
/ 20 марта 2009

Zsolt, избегайте жестко закодированных имен файлов, используйте вместо этого переменную HISTFILE, с запасным вариантом, если вы действительно параноик: $ {HISTFILE: - ~ / .bash_history}; -)

Какая-то необходимость просматривать файлы истории ?! Вы потеряете номер истории, что необходимо для репликации команды (например,! 33 для повторного выполнения 33-й записи из вашей истории) без необходимости копировать и вставлять вывод grep.

Имейте в виду, что использование такого рода расширений $ @ может привести к сбою на разных (эпических) уровнях. Например, аргумент, начинающийся с «-» (histgrep -h), обычно будет зависать или стрелять себе в ногу. Действительно, этот базовый пример можно легко обойти, следуя классическому "-" способу разделения аргументов от параметров , но обсуждение не имеет конца, помня, что аргументы должны быть при условии, что взломать будут регулярные выражения. ; -)

О, и не является ли Histgrep слишком многословным выбором? h, i, Tab, g, Tab:)

ИМХО, я бы придерживался ^ R, возвращаясь к истории | grep ... всякий раз, когда это необходимо. Во всяком случае, ради примера, я бы (лениво) переписал этого маленького помощника как:

function hgrep() { history | grep -P -- "$*"; }
3 голосов
/ 20 марта 2009

Вы всегда можете использовать CTRL-R для поиска в своей истории в обратном направлении и ввести некоторую часть предыдущей команды. Повторное нажатие CTRL-R (после первого попадания) повторяет ваш запрос (переход к следующему совпадению, если есть).

Лично я использую это для поиска регулярных выражений (так как поиск регулярных выражений пока невозможен (AFAIK)):

# search (using perl regexp syntax) your entire history
function histgrep()
{
     grep -P $@ ~/.bash_history
}   

Edit: Для поиска самых последних элементов истории с помощью этой функции см. this (о настройке $ PROMPT_COMMAND).

2 голосов
/ 20 апреля 2009

Смотрите мой ответ здесь

Пример:

$echo happy
happy
$!?pp?
happy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...