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


115

Я знаю, що можу використовувати Upітерацію за допомогою попередніх команд. Запуск останньої команди просто включає Up+ Enter. Однак я думав придбати клавіатуру Happy Hacking Keyboard, оскільки витрачаю багато часу vim.

На цій клавіатурі немає клавіш зі стрілками, і єдиний спосіб, як я знаю, як отримати таку поведінку, - натискаючи Ctrl+ Rта починаючи повторювати свою попередню команду.

Чи є простий спосіб емуляції Up+ Enterв терміналі UNIX без клавіш зі стрілками?


1
Вам слід замінити термінальний тег оболонкою, яку ви використовуєте.
Крістіан Цюпіту

2
@ iluminÉ ні миші ...
Quant

Чи не було припинено роботу клавіатури Happy Hacking у 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.


1
@ Арман Радий допомогти. Існує ціла кількість команд розширення історії; посилання перераховує деякі з них. Я редагував деяку інформацію про магічний простір, яка може допомогти у використанні деяких із них.
Sparhawk

3
magic-spaceце один солодкий варіант!
fduff

1
Також є histverifyможливість, через shoptяку readline буде виконувати розширення історії, але не виконає команду при першому натисканні клавіші введення. Що дозволить оцінити результат і вирішити, чи це те, що ви хочете запустити.
Ітан Рейснер

2
Ніколи не зрозумів чому !! використовується набагато більше, ніж CTRL-P. CTRL-P дозволяє вам бачити команду перед її виконанням - і ви навіть можете вносити зміни до неї. Мені завжди здається, що я кочу кістки !!
абонет

1
@abonet Ще одне використання, яке я щойно знайшов, - !!це використання його розширення на місці . Наприклад sudo !!.
Спарховк

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
Timo

1
Це реалізовано бібліотекою readline. Подальші ярлики можна знайти в його документації.
Spidey

28

Моя улюблена - CTRL+, Pа потім CTRL+O

Це працює за замовчуванням, додаткова конфігурація не потрібна. ^ P дозволить вам перейти до останньої команди, а ^ O дозволить виконати поточний рядок

Зауважте, що CTRL+ Oможна використовувати стільки разів, скільки вам потрібно


2
^ O нічого не робить на моєму Mac.
Snowcrash

1
@Snowcrash Try^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вже повинні працювати, не змінюючи нічого.


9

З будь-якої POSIX оболонки , що реалізує користувача Переносимость варіант (включає в себе ksh, zsh, bash, yash), ви можете також використовувати fcкоманду:

fc -e : -1

Дивіться приклад:

$ echo "hello"
hello

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

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


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, наприклад, шпаклівку, моїм улюбленим способом продовження є вибір команди, що включає канал рядка, скопіюйте її в буфер обміну, а потім скористайтеся правою кнопкою миші, щоб вставити її. Це повторює команду одним клацанням миші. Це також добре працює для послідовності команд, розділених напівколонами.


0

ви можете використовувати !nдля виконання n-ї команди в терміналі. де 'n' - рядок немає historyкоманди.


Яка оболонка розширюється !?до останньої команди? Ви впевнені, що не змішуєте це !!(що вже було розглянуто в інших відповідях)?
Ентоні Геоґеган

вибачте, насправді я експериментував у цій команді. будь ласка, перевірте відредаговану відповідь. @AnthonyGeoghegan
Раві Севта

Це був ярлик, який я шукав. Дякую!
le_daim

0
  • Введіть Історію та зазначте номер перед командою, яку потрібно виконати та використовувати !number

  • Ви також можете використовувати ! -1 (1 є останньою командою, яку ви виконуєте, замініть її на номер рахунку, який ви отримаєте, коли ви виконуєте його знизу, зберігаючи останнє виконане як 1)

  • ! -2 (остання секунда тощо)

0

Є кілька шарів, в яких можна попросити останню команду.

Редактор рядків

Редактор рядків (де ви вводите ваші команди) надається безпосередньо ksh, читальним рядком бібліотеки в bash і бібліотекою zle в zsh. Інші оболонки, як-от тире, можуть не мати бібліотеки для редагування, щоб зрозуміти ці клавіші (якщо не складено з --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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.