Как мне повторить последнюю команду без использования клавиш со стрелками?

115

Я знаю, что могу использовать Upдля перебора предыдущих команд. Запуск последней команды просто включает Up+ Enter. Тем не менее, я думал о покупке клавиатуры Happy Hacking, поскольку я провожу много времени vim.

Эта клавиатура не имеет клавиш со стрелками, и я знаю, как получить такое поведение, нажав Ctrl+ Rи начав повторять мою предыдущую команду.

Есть ли простой способ эмулировать Up+ Enterв терминале UNIX без клавиш со стрелками?

шест для отталкивания
источник
1
Вы должны заменить тег терминала на оболочку, которую вы используете.
Кристиан Чиупиту
2
@ Illumine нет мыши ...
Квант
Разве Happy Hacking Keyboard не был снят с производства в 2006 году?
Питер Мортенсен
@PeterMortensen нет, это все еще доступно. Возможно, вы имеете в виду первую версию, но новые модели по-прежнему доступны.
квант

Ответы:

164

С cshили любой оболочкой реализацией csh-как историей замещения ( tcsh, bash, zsh):

!!

Потом Enter.


Или в качестве альтернативы :

!-1

Потом Enter.


Или Ctrl+ P,Enter


Волшебное пространство

Также обратите внимание, что !!и !-1не будет автоматически расширяться для вас, пока вы не выполните их (когда это может быть слишком поздно).

При использовании bash, вы можете положить bind Space:magic-spaceв ~/.bashrc, то нажатие Spaceпосле команды будет автоматически развернуть их в линию, что позволяет проверить их перед выполнением. Это особенно полезно для расширения истории из команды, запущенной некоторое время назад, например, !echoбудет тянуть последнюю команду, начиная с echo. С магическим пространством вы можете просмотреть команду до ее запуска.

Это эквивалентно действию bindkey ' ' magic-spaceв tcshили zsh.

Sparhawk
источник
1
@ Арман рад помочь. Есть много команд расширения истории; ссылка перечисляет некоторые из них. Я отредактировал некоторую информацию о волшебном пространстве, которая может помочь с использованием некоторых из них.
Sparhawk
3
magic-spaceэто один сладкий вариант!
Флуд
1
Также есть histverifyопция, shoptкоторая заставит readline выполнить расширение истории, но не выполнит команду при первом нажатии клавиши ввода. Который позволит вам оценить результат и решить, если это то, что вы хотите запустить.
Этан Рейснер
2
Никогда не понимал почему !! используется гораздо больше, чем CTRL-P. CTRL-P позволяет увидеть команду перед ее выполнением - и вы даже можете внести в нее изменения. Я всегда чувствую, что играю в кости!
абонемент
1
@abonet Еще одно применение, которое я только что нашел, !!- это использование его расширения на месте . Например sudo !!.
Sparhawk
50

Большинство оболочек, которые имеют функцию редактирования командной строки, поддерживают привязки клавиш Emacs. (крошечное подмножество)

Up     Ctrl+P
Down   Ctrl+N
Left   Ctrl+B
Right  Ctrl+F
Home   Ctrl+A
End    Ctrl+E
Delete Ctrl+D

Кроме того, вы можете настроить свою оболочку на использование режима редактирования команд vi, добавив set -o viв файл запуска оболочки (например, ~/.bashrc). Тогда, например, вы можете

  • Используйте EsckEnter для повторного выполнения предыдущей команды (так же, как !!). Клавиша минус -также работает как команда «двигаться вверх».
  • Используйте EsckkkkkkkkkkkkEnter или Esc12kEnter для повторного выполнения 12-й предыдущей команды (так же, как !-12).
  • Используйте Escи команду движения (то есть, kсоответственно, повторенную), а затем отредактируйте командную строку bash, которую вы там найдете. Помните, что вы все равно будете в viкомандном режиме, так что вам нужно будет использовать viкоманду редактирования (например, I, A, C, R, или один из их коллег строчных) на самом деле добавить в команду из истории.
    Так, например, EsckisudoSpaceEnterэквивалентно sudo !!.
  • Для опытных пользователей: вы можете даже скопировать ( y ank) текст из одной строки и вставить ( p ut) его в другую, чтобы получить результаты, сравнимые с !-2:- !$. (К сожалению, он не поддерживает именованные буферы.)
жилль
источник
Я знал об отношениях emacs с терминалом ... но viтрюк был отличным !!!
Dox
Я получил за deleteCtl + U в Zsh
Тимо
1
Это реализовано библиотекой readline. Дальнейшие ярлыки можно найти в его документации.
Spidey
28

Мой любимый CTRL+ Pто CTRL+O

Это работает по умолчанию, дополнительная настройка не требуется. ^ P позволит вам переключиться на последнюю команду, а ^ O позволит вам выполнить текущую строку

Обратите внимание, что CTRL+ Oможно использовать столько раз, сколько вы хотите

маргаритка
источник
2
^ O ничего не делает на моем Mac.
Snowcrash
1
@Snowcrash Попробуй^J
маргаритка
это просто повторяет пустую строку, даже если я сделал lsили pwdранее.
Snowcrash
@ Snowcrash Это ^ P тогда ^ J ...
Дейзи
Ctrl + P не работает на HP-UX (я не знаю, какую оболочку он использует). Обходной путь должен вызвать `zsh '.
Питер Мортенсен
15

Конечно! Так как вы привыкли к viсочетаниям клавиш, почему бы не настроить свою оболочку для реагирования на них? Для bash, поместите это в свой ~/.inputrc:

set editing-mode vi

Запущенные экземпляры bash не будут перечитывать файл, поэтому выйдите из системы и вернитесь обратно.

zshдаже обнаружит это для вас: если ни один из ваших сценариев запуска не заставляет режим редактирования так или иначе использовать bindkey и если $EDITORобнаруживается, что переменная окружения содержит vi, то он автоматически активирует viпривязки клавиш. Если вам нужно форсировать это, укажите это в вашем ~/.zshrc:

bindkey -v

После этого используйте, ESCкак обычно, для ввода в командной строке и kи jдля перемещения вверх и вниз.

ТАКЖЕ : Привязки оболочки по умолчанию в большинстве оболочек являются Emacs переплетов, так на самом деле Crtl-Pи Ctrl-Nуже должны работать без вас ничего менять.

Celada
источник
9

С любой POSIX оболочки , реализующей пользователя Переносимость вариант (включает в себя ksh, zsh, bash, yash), вы можете также использовать fcкоманду:

fc -e : -1

Смотрите пример:

$ echo "hello"
hello

$ fc -e : -1
echo "hello"
hello

Больше информации в разделе Выполнение ряда команд из исторического ответа Джонатана Леффлера.

fedorqui
источник
6

Для всех пользователей Mac iterm2:

Вы можете связать + Rс 0x0C 0x10 0x0d. Это очистит терминал и выполнит последнюю команду.

iterm 2 ключевых предпочтения

Брайан Виггинтон
источник
Есть ли способ повторить последнюю команду без очистки терминала?
Люк Дэвис
Ах, не берите в голову: для любого, кто читает это, для повторения без очистки терминала используйте 0x10 0x0d(т.е. опустите 0x0C).
Люк Дэвис
5

Я считаю, что мне нужно часто повторять команды как суперпользователь, поэтому

sudo !!

повторяет предыдущую команду, как если бы я sudoсначала запомнил ввод текста .

Джаред Чмелецкий
источник
2
Мне очень нравится это, также выглядит как хороший ответ на «отказано в авторизации». "Я имел в виду sudo ffs!"
Виктор Меллгрен
3

kshОболочка имеет псевдоним по умолчанию , rкоторая повторяет последнюю команду. Это связано с fc -s:

alias r='fc -s'

Интересно, что bashдокументация для fcвстроенного ( help fcи также в самом руководстве) даже упоминает об этом, но это не псевдоним по умолчанию в этой оболочке:

Полезный псевдоним для использования в этом случае r='fc -s', так что при наборе r cc выполняется последняя команда, начинающаяся с, ccа при rповторном выполнении последняя команда.

В bash, это также будет работать, даже если вы отключили расширение истории с set +H.

В zshоболочке есть rвстроенная функция, которая задокументирована так же, как fc -e -.

fcУтилита является стандартной утилитой POSIX .

Кусалананда
источник
2

С cshили любой оболочки реализацией csh-like историей замещения ( tcsh, bash, zsh), вы можете также использовать !<beginning of command>для вызова последней команды , начиная с <beginning of command>.

например, если вы бежали

$ tail file.txt
$ less otherfile.txt
$ !ta

!ta выполнит tail file.txt

Дэн
источник
1

tl; dr !!просто добавляет последнюю команду к вашей текущей команде. <backtick>!!<backtick> выполняет последнюю команду и добавляет результат к вашей текущей команде.

На самом деле есть 2 варианта:

  1. Сама последняя команда
  2. Результат последней команды

Позвольте мне показать вам 2 примера:

Пример 1

$ mkdir /test
mkdir: /test: Permission denied

$ sudo !!
sudo mkdir /test
Password:

Как вы видите выше, я выполняю команду и, по сути, просто добавляю последнюю команду.

Еще один вариант

Пример 2

$ find ~/Documents "test.txt"
/Users/<user>/Documents/test.txt

$ vi `!!`
# Opens test.txt. But if you do
$ vi !!
vi find ~/Documents -name "test.txt"
VIM - Vi IMproved 8.1 (2018 May 18, compiled Oct 29 2018 06:55:58)
Unknown option argument: "-name"
More info with: "vim -h"
Прадьюмна Шембекар
источник
+1 за vi `!!`. Очень полезно
le_daim
0

Когда я использую хороший эмулятор xterm, например, putty, мой любимый способ продолжить - выбрать команду, включая перевод строки, скопировать ее в буфер обмена и затем щелкнуть правой кнопкой мыши, чтобы вставить ее. Это повторяет команду в один клик. Это также хорошо работает для последовательности команд, разделенных точками с запятой.

Бернард Перрен
источник
0

Вы можете использовать !nдля выполнения n-й команды в терминале. где 'n' - это номер строки historyкоманды.

Рави Севта
источник
Какая оболочка расширяется !?до последней команды? Вы уверены, что не путаете это !!(что уже было рассмотрено в других ответах)?
Энтони Геогеган
извините, на самом деле я экспериментировал с этой командой в то время. пожалуйста, проверьте отредактированный ответ. @AnthonyGeoghegan
Рави Севта
Это был ярлык, который я искал. Спасибо!
le_daim
0
  • Введите History и запишите номер перед командой, которую вы хотите выполнить и использовать !number

  • Вы также можете использовать ! -1 (1 - последняя выполненная вами команда, замените ее на число, которое вы получите при выполнении снизу, оставив последнюю выполненную как 1)

  • ! -2 (второй последний и так далее)
Lovish
источник
0

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

Линейный редактор

Редактор строк (где вы вводите свои команды) предоставляется непосредственно ksh, библиотекой readline в bash и библиотекой zle в zsh. Другие оболочки, такие как dash, могут не иметь библиотеки редактирования для понимания этих ключей (если они не скомпилированы с --with-libeditвключенной опцией).

Эта работа в ksh, bash, zsh:

Ctrl- P# Режим Emacs (предыдущий)
Ctrl- N# Режим Emacs (следующий)
ESC- k # Режим vi ESC для перехода в командный режим и k для перехода в верхнее положение
ESC- j # vi Режим ESC для перехода в командный режим и j для перехода в нижнее положение

история

Система истории, предоставляемая многими оболочками, позволяет расширить некоторые ярлыки:

!!    # bash and zsh, may be provided by `alias \!\!='fc -e -'` in ksh.
!-1   # bash and zsh only

команды

Есть несколько команд, которые могут получить команды истории.

Как довольно многословная команда (только для печати):

history 2 | head -n-1

или более старая и, следовательно, обычно более переносимая fcкоманда (непосредственно повторяется):

fc -e - -1

Или, может быть, проще fc -s -1, но zsh не принимает такую ​​опцию для fc.

Если вы хотите только напечатать команду, используйте: fc -nl -1 -1.

Для редактирования значения FCEDITв текстовом редакторе (напр Е.Д. Emacs, VI, и т.д.) и использовать FC непосредственно: fc -1.

Исаак
источник