2009-03-20 4 views
3

Я знаю о навигации по истории bash со стрелками вверх и вниз.Bash: выберите предыдущую команду, соответствующую шаблону

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

Возможно ли это с помощью bash?

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

ответ

3

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

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

# search (using perl regexp syntax) your entire history 
function histgrep() 
{ 
    grep -P [email protected] ~/.bash_history 
} 

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

+0

я мог быть неправ это, но я думал, что файл истории записывается, когда пользователь выходит из системы, поэтому, если это правда, то этот файл не содержит последних команд. Спасибо, CTRL-R. – Anonymous

+0

См. Это для обновления файла истории автоматически после каждой команды: http://briancarper.net/blog/keeping-bash-history-in-sync-on-disk-and-between-multiple-terminals HTH –

+0

'grep -P' не работает на mac os x yosemite, rremoved '-P' работает. – Jichao

4

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

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

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

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

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

function hgrep() { history | grep -P -- "$*"; } 
+0

Спасибо за подсказку! (+ 1) –

2

Смотрите мой ответ here

Пример:

$echo happy 
happy 
$!?pp? 
happy 
Смежные вопросы