Рейтинг:16

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

флаг cn

Я использую Убунту 21.10. Если я ошибусь, я могу повторно запустить последнюю команду с помощью !!. Вот пример:

$ удачное обновление
Чтение списков пакетов... Готово
E: Не удалось открыть файл блокировки /var/lib/apt/lists/lock — открыть (13: Отказано в доступе)
E: Невозможно заблокировать каталог /var/lib/apt/lists/
W: Проблема с отсоединением файла /var/cache/apt/pkgcache.bin — RemoveCaches (13: Отказано в доступе)
W: Проблема с отсоединением файла /var/cache/apt/srcpkgcache.bin — RemoveCaches (13: Отказано в доступе)
$ судо !!
судо подходящее обновление
[sudo] пароль для [меня]:
...
Получено 336 КБ за 2 с (206 КБ/с)
Чтение списков пакетов... Готово
Построение дерева зависимостей
Чтение информации о состоянии... Готово
98 пакетов могут быть обновлены. Запустите «apt list --upgradable», чтобы увидеть их.

Это хорошо, но вместо повторного запуска предыдущей команды, как я могу запустить предыдущую? Как это:

$ эхо привет
Привет
$ эхо привет
Привет
$ !! <-- Я пытаюсь запустить "эхо привет"
Привет

В общем, вот что я ищу

$ эхо привет
Привет
$ эхо привет
Привет
$ ??? <-- Что я могу указать здесь, чтобы запустить «эхо привет»?
эхо привет!
Привет!

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

raj avatar
флаг cn
raj
Ярлыки типа `!!` были полезны в старом добром `sh`, где не было истории команд и редактирования. В `bash` их больше не нужно использовать, так как вы можете свободно переходить к предыдущей/следующей командам, нажимая стрелку вверх/вниз.
bac0n avatar
флаг cn
`echo $(!-2)`, также есть возможность вставлять указатели событий.
флаг cg
Если вы хотите запустить команду до того, как запустили предыдущую, я бы предложил использовать надстройку для машины времени для bash. Принимая во внимание, что если вы хотите повторно запустить предыдущую команду, это другая история.
флаг cg
Да... "повторно выполнить предыдущую команду" или "повторно запустить N-ю команду из истории"
Itération 122442 avatar
флаг us
+1, потому что ты научил меня !! :)
флаг br
JoL
@raj По согласованию с bac0n я также использую их для встраивания. Иногда я запускаю одну команду, затем другую, потом хочу сравнить результаты и делаю что-то вроде `diff -u
Peter - Reinstate Monica avatar
флаг hn
https://man7.org/linux/man-pages/man3/readline.3.html, Ctrl-F «Команды для управления историей»
Рейтинг:41
флаг au

Вы можете использовать стрелка вверх и Кнопка "Стрелка вниз клавиши для циклического просмотра истории команд. Итак, чтобы повторно запустить предпоследнюю команду, вы должны нажать стрелка вверх дважды, затем возвращаться.

Это имеет ряд преимуществ перед такими методами, как !-2. Самое главное (на мой взгляд), вы можете увидеть команду и убедиться, что это та команда, которую вы намеревались запустить повторно, прежде чем нажимать клавишу возврата, чтобы выполнить ее. Даже помимо простых ошибок («ой, я думаю, это была третья команда, которую я хотел»), история bash может не учитывать предыдущие команды так, как вы ожидаете, из-за таких параметров, как игнорспейс, игнорировать, и ГИСТКОНТРОЛЬ переменная.

Кроме того, интерактивный вызов команды позволяет легко редактировать команду перед ее повторным запуском. Вы также можете сделать это с помощью модификаторов отзыва истории, но опять же, делая это в интерактивном режиме, вы можете увидеть свои изменения перед выполнением отозванной/модифицированной команды.

Плюс, если вы ленивы, как я, стрелка вверх стрелка вверх возвращаться легче напечатать, чем (сдвиг) восклицательный знак минус 2 возвращаться

Quasímodo avatar
флаг jp
«Самое главное (на мой взгляд), вы можете увидеть команду и убедиться, что это та команда, которую вы намеревались запустить повторно, прежде чем нажимать клавишу возврата, чтобы выполнить ее». Если вы включите `histverify`, то любая команда с подстановкой истории должна быть подтверждена перед анализом оболочкой. Тем не менее, я ленив, как и вы, поэтому я бы поддержал ваше предложение в этом конкретном случае.
Ruslan avatar
флаг bv
Если вы предпочитаете держать руки на домашнем ряду, а не блуждать по клавиатуре, более простой комбинацией будет Ctrl-P (запомните как «Предыдущая») вместо «Стрелка вверх» и Ctrl-N (как для «Далее») вместо стрелки вниз. Таким образом, Ctrl-PP, Возврат.
Nate T avatar
флаг it
Основным недостатком является отсутствие скриптов. По крайней мере, в какой-либо разумной форме.
Akbarkhon Variskhanov avatar
флаг mx
Вы также можете нажать M-^ (например, Alt+Shift+6 или ESC Shift+6), чтобы начать расширение истории в текущей строке.
Рейтинг:35
флаг hr

От ИСТОРИЯ РАСШИРЕНИЕ часть человек:

!-n Ссылка на текущую команду минус n

Итак, чтобы запустить команду перед последней, вы можете использовать !-2

Фактически, !! это всего лишь синоним !-1

флаг tw
Вы имеете в виду, что ученые-компьютерщики начинают считать с нуля при движении вперед и с -1 при движении назад? Где эти умники научились считать?
SusanW avatar
флаг in
@MikeMaxwell должно быть просто причудой истории :-D
OmarL avatar
флаг sy
@MikeMaxwell, в данном случае 0 — это то, что вы сейчас вводите; -1 — предыдущая команда, -2 — предыдущая, но одна. Это имеет смысл для меня :-)
HiddenWindshield avatar
флаг us
@OmarL Итак, если следующей командой, которую я собираюсь ввести, будет «echo «Фондовый рынок будет X» через два часа, значит ли это, что я могу использовать `! 1`, чтобы увидеть, какие акции рынок будет через два часа?
OmarL avatar
флаг sy
@HiddenWindshield Это ... креативно, но без игральных костей: `-bash: !1: событие не найдено`
Рейтинг:7
флаг tz

!-н выполнить команду "-n" вашей истории, но я бы не рекомендовал ее, так как она "мгновенная" и не даст вам времени, чтобы сначала проверить, что "N-я" команда является правильной, которую вам нужно выполнить снова.. , ( @bac0n хорошо заметил, что вы можете установить: shopt -s его проверка чтобы переключить его на «не мгновенный»: это позволит вам проверить, что команда !-n расширяется до, прежде чем выполнять ее с помощью <Enter>)

Однако, если вы используете бить в качестве оболочки я предпочитаю использовать функцию поиска:

Ctrl а затем введите что-нибудь, который является частью команды, которую вы ищете. (бывший: Ctrl + р + (введите в терминал) эхо)

Он представит последнее событие в вашей истории сопоставления что-нибудь (т. е. совпадение поискового запроса, введенного после Ctrl + р).

Последующий Ctrl + р заглянет еще дальше в вашу историю. Или добавление букв уточнит поиск.

И как только вы найдете подходящее совпадение, нажмите Войти выполнить его снова (или Ctrl + с для выхода из поиска без выполнения отображаемой в данный момент соответствующей команды).

Дополнительный совет: если вместо Войти , вы нажимаете Ctrl + о , он выполнит выбранную команду истории И представит следующую, готовую к выполнению с помощью Войти (который выполняет только это и возвращается к обычному приглашению) или Ctrl + о снова (который выполняет его и представляет следующую команду в вашей истории). Очень полезно повторять последовательность шагов и отображать эти команды перед их выполнением.

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

bac0n avatar
флаг cn
Это зависит от того, как вы настроили опцию оболочки... вы можете добавить `shop -s histverify`, если вы не хотите запускать запись напрямую.
Nate T avatar
флаг it
Кроме того, вы можете добавить, что это специфично для bash. Большинство современных оболочек имеют отслеживание/повторный запуск истории в той или иной форме, но реализация и синтаксис/ярлыки будут отличаться от одной оболочки к другой.
флаг tz
спасибо @NateT и bac0n, 2 хороших момента, которые я пропустил в своем ответе. Я отредактировал его в.
Ruslan avatar
флаг bv
В дополнение к Ctrl-R для `reverse-i-search`, есть Ctrl-S для прямого `i-search` (полезно, когда вы пропустили нужную запись и вам нужно вернуться «назад»), хотя есть [предостережение] (https ://stackoverflow.com/q/791765/673852).
флаг tz
@Ruslan добавляет интересную вещь, но я не удосужился добавить ее, так как она используется реже и иногда связана с другими вещами (ctrl-s [останавливает терминал от вывода символов] ctrl-q [возобновляет символ вывод], например, по умолчанию во многих оболочках. См. https://unix.stackexchange.com/a/72092/27616). Чтобы все это заработало, могут потребоваться некоторые дополнительные настройки (readline? и stty), и примеры можно найти на unix.se.
Ruslan avatar
флаг bv
@OlivierDulac это именно то предостережение, на которое направлена ​​моя ссылка :)
флаг tz
@Руслан: ой, не заметил, извини ^^
Рейтинг:4
флаг cn

Если вы запустите

история

вы получите список последних введенных команд 'n'. Размер истории по умолчанию составляет 500 команд. Итак, как объяснил steeldriver, команду перед последней можно запустить повторно с помощью

!-2

и да, предпоследний будет

!-3

и так далее. Для более подробной информации используйте

история человека

и искать Обозначения событий.

kopaka avatar
флаг cn
Небольшое дополнение: вы можете запустить определенную команду из истории, просто используя `!312` (чтобы запустить команду со строкой номер 312, показанной в выводе истории). Еще более полезный совет: если вы допустили опечатку в этой команде, вы можете запустить `!312:p`, которая не выполнит команду, но все же поместит ее сверху как «последнюю использовавшуюся команду». Это поможет вам редактировать более длинные команды без ручного копирования и вставки из истории, просто используя стрелку вверх и редактируя команду перед ее запуском.
Latkar avatar
флаг cn
Большой! Список модификаторов «истории» полон сюрпризов. Спасибо!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.