Узнайте, какая команда, которую я последний раз запускал, запускается определенным образом?

9

В среде командной строки bash вы можете выполнить !!свою последнюю команду. И вы можете нажать стрелку вверх, чтобы увидеть последнюю команду, которую вы выполнили. Но что, если вы хотите видеть, но не запускать последнюю команду, которая была запущена определенным образом?

bernie2436
источник
1
Не могли бы вы изменить свой вопрос. Мне до сих пор не ясно, о чем вы спрашиваете.

Ответы:

19

Если вы просматриваете историю с помощью Ctrl+ rи вводите несколько букв команды и не нажимаете, Enterа нажимаете , команда появится и не запустится. Другая альтернатива:

history | grep 'mycommand'

Эта хорошая история может также помочь.

MKC
источник
1
И если вы не ищете первое совпадение и хотите продолжить поиск в обратном направлении, нажмите Ctrl-R снова и снова. И это только одна из многих мощных команд, предоставляемых библиотекой bash history & readline.
Орион
Учитывая, что у вас есть проверенный ответ, я возьму мой, и если вы хотите использовать "^.\{7\}pattern"выражение в своем ответе, вы можете это сделать!
если вы хотите отредактировать несколько команд и перезапустить их, вы также можете использоватьfc ### ###
Kiwy
10

Вы можете показать последний запуск команды, по Append :pк !!:

$ echo 123
123
$ !!:p
echo 123

Если вы хотите, чтобы команда show last выполнялась с определенным именем, используйте один восклицательный знак:

$ echo 123
123
$ pwd
/home/cuonglm
$ !echo:p
echo 123
cuonglm
источник
4

Каждый ответ здесь, насколько я могу судить, непереносим. Для портативного варианта рассмотрим POSIX-гарантированное fc:

    $ man fc

-E редактор Используйте редактор, названный редактором, чтобы редактировать команды. Строка редактора - это имя утилиты, подлежащее поиску черезпеременную PATH ... Значение впеременной FCEDIT должно использоваться по умолчанию, еслине указан ключ -e . Если FCEDIT равен нулю или не задан, ed должен использоваться в качестве редактора.

−l (буква ell.) Перечислять команды, а не вызывать для них редактор. Команды должны быть записаны в последовательности, указанной первым и последним операндами, на которые влияет -r , причем каждой команде предшествует номер команды.

-N Подавить номера команд при перечислении с −l .

−r Обратный порядок команд, перечисленных−l ) или отредактированных (без −l и −s ) .

-S Повторно выполнить команду без вызова редактора.

ОПЕРАНДЫ

первый , последний Выберите команды для просмотра или редактирования. Количество предыдущих команд, к которым можно получить доступ, определяется значениемпеременной HISTSIZE . Значение first или last или обоих должно быть одним из следующих:

[+ or-] число Положительное (или отрицательное ) число, представляющее номер команды; номера команд могут отображаться с параметром -l ... Например, -1 является непосредственно предыдущей командой ...

Когда параметр -l используется для вывода списка команд, формат каждой команды в списке должен быть следующим:

    "%d\t%s\n", <line number>, <command>

Если указаны оба параметра -l и -n , формат каждой команды должен быть следующим:

    "\t%s\n", <command>

Если состоит из более чем одной строки, строки после первой должны отображаться как:

    "\t%s\n", <continued-command>

Но обязательно используйте -l или -e, если вы ТОЛЬКО хотите видеть / редактировать ваши команды. По умолчанию fcоткроется список команд, запрошенный в FCEDIT (обратите внимание, что он отличается от переменной среды EDITOR ), и, когда FCEDIT завершит работу,fc будут работать отредактированные команды.

Во всяком случае, конкретно ответ на этот вопрос может быть:

    % fc -l -1

Или без номеров строк:

    % fc -ln -1

Или последние пять команд в обратном порядке:

    % fc -lrn -1 -5

В вашем пейджере:

    % fc -lrn -1 -5 |$PAGER

Для вашего последнего звонка fc:

    % fc -l fc
mikeserv
источник
+1 за усилие. Тем не менее, вопрос помечен bash
grebneke
Это работает bash, и все остальное. Использование bashне исключает мобильности, но, безусловно, развитие вредных привычек будет.
mikeserv
Лучший ответ здесь и должен быть принят за счет переносимости.
wildeyes
3

нажмите и Ctrlrначните вводить команду, которую вы хотите увидеть. Баш будет постепенно завершен. Когда вы будете удовлетворены, нажмите, Enterчтобы запустить его или Ctrlgпрервать.

Гленн Джекман
источник
2

Если вы просто хотите использовать последнюю команду:

 history | cut -c 8- | tail -n 2 | head -n 1 

Если вы хотите сделать это несколько раз, поставьте перед собой пробел historyили используйте:

 history | cut -c 8- | grep -Ev '^history' | tail -n 1

Если вы просто хотите увидеть последнюю команду, начинающуюся с pattern xyz:

 history | cut -c 8- | grep -E '^xyz'  | tail -n 1 

Но это не работает, если шаблон будет начальными символами «истории», а затем вам понадобится что-то вроде:

history | cut -c 8- | grep -Ev 'history \|' | grep -E '^hist'  | tail -n 1 
Энтон
источник
В вашем первом использовании есть опечатка cut.
Джон
1
bind '"\ep": history-search-backward'
bind '"\en": history-search-forward'

И затем вы можете ввести текст, а затем Alt-pискать последние команды, которые начинаются одинаково (и Alt-p,Alt-n к циклу назад и вперед корыта них).

(Это связка ключей по умолчанию для похожих виджетов в zsh)

Стефан Шазелас
источник
0

Добавьте эти строки в файл ~/.inputrc:

"\e[A": history-search-backward
"\e[B": history-search-forward

Затем source ~/.inputrcв вашей оболочке (или просто перезапустите оболочку).

Теперь вы можете ввести несколько букв команды, а затем с помощью стрелок вверх / вниз пролистать команды, начинающиеся с этих нескольких букв.

Wim
источник