История команды

История команды

Часто в Терминале (хотя я полностью ожидаю, что любой ответ сработает в bash и большинстве других) я набираю какую-то команду, а затем получаю какую-то ошибку прав доступа из-за отсутствия sudo.

Итак, нажмите «вверх», удерживайте/нажмите «влево», введите текст sudoи нажмите «Enter».

Это раздражает. Чем длиннее была команда, тем сильнее.

Обратите внимание, что пропуск sudo— это худший случай; опечатка ближе к началу, чем к концу — тоже раздражает..

Мне бы хотелось иметь способ выполнить своего рода нажатие клавиши 'вверх и домой'. На самом деле, возможно, эти два нажатия сделают это, но на моей клавиатуре Macbook нет кнопки Home, поэтому я не могу попробовать.

Бонусные баллы за возможность sudoавтоматически вставлять и нажимать «Enter», скажем, с помощью CMD+Shift+S.


Возможно ли это сделать или я сплю?

решение1

Просто используйте UPи CTRL-A.

Оба !sudoи sudo !!функционируют легко. С разницей:

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

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

  • Обычно CTRL-Aпереносит вас в начало строки в терминале Linux и CTRL-Eв конец.
    Если вы хотите, вы можете продолжать использовать свою стратегию. Вам нужно только открыть ярлык вашей системы. Вы можете найти списокярлыкив графической и текстовой среденапример здесь.

Толькопредупреждение: sudo !!и !sudoработают очень быстро иу вас нет визуального контроля над строкой, которую вы запускаете как суперпользователь. Это может привести квредныйиногда. Особенно если вы допустили опечатку.

Давайте рассмотрим яркий пример:

cd $HOME/Directory_To_Delete  # You go to delete what is inside a directory
rm -rf . ; cd ..              # You do it and go up of one
 apt-get update               # Note the space in the beginning of the line  
sudo !!                       # Gone!! Now you realize you never really wanted 

Слишком поздно, вы только что стерли свой домашний каталог и все подпапки!!.

Когда вы пишете команду с пробелом в качестве первого символа, возможно, что она не будет завершена в истории. Это зависит от значения переменной $HISTCONTROL. Если список ее значений включаетигнорироватьпространство(илиигнорироватьоба) строки, начинающиеся с пробела, не сохраняются в списке истории. Поэтому с помощью sudo !! вы выполните последнюю команду перед этим.

Вы можете представить себе похожую ситуацию с !sudo, он выполнит последнюю команду, начинающуюся с sudoзаписанной в истории, но если последняя, ​​которую вы помните, начиналась с пробела... теперь вы знаете, что будете использовать другую.

Последнее замечание: чем менее драматична ваша ошибка, тем более она может быть коварна, поскольку может пройти незамеченной вами... и вы рискуете быть вынужденным заплатить все проценты по счету, который вы не можете вспомнить.


Обновление (Bash великолепен):
В последних версиях Bash это опасное поведение можно исправить с помощью следующей команды, которую я предлагаю поместить в ~/.bashrcфайл:

shopt -s histverify

Из man bashвы можете прочитать

Еслиисторияпроверитьопция оболочки включена иридлайниспользуется,Подстановки истории не передаются немедленно в анализатор оболочки.Вместо этого расширенная строка перезагружается в буфер редактирования readline для дальнейшего изменения.

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

решение2

Вот несколько распространенных комбинаций клавиш, которые используют многие программы для Mac и Linux (хотя я не уверен, какие из них используются в большинстве приложений для Windows):

  • CTRL-A- Переместить курсор в начало текущей строки.
  • CTRL-E- Переместить курсор в конец текущей строки.
  • CTRL-Left- Переместить курсор на одно слово назад
  • CTRL-Right- Переместить курсор вперед на одно слово

решение3

Использовать

sudo !!

Будет !!заменена полной предыдущей командой.

решение4

@WChargin прав относительно !sudo, ​​поэтому я меняю свой ответ...

sudo !!— это правильный ответ, как сказали многие.

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


История команды

Команду history можно использовать для просмотра журнала Bash с введенными вами командами:

Этот журнал называется «история». Чтобы получить к нему доступ, введите:

history n 

Это выведет только последние n команд. Введите «history» (без опций), чтобы увидеть весь список истории.

Вы также можете ввести!nдля выполнения команды номер n. Используйте!!для выполнения последней введенной вами команды.

!-nвыполнит команду n раз прежде (другими словами!-1эквивалентно!!).

!stringвыполнит последнюю команду, начинающуюся с этой «строки» и !?string?выполнит последнюю команду, содержащую слово «string». Например:

!cdповторно выполнит последнюю введенную вами команду, начинающуюся с «cd».

commandName !*выполнит «commandName» с любыми аргументами, которые вы использовали в последней команде. Это может быть полезно, если вы, например, допустили орфографическую ошибку. Если вы ввели:

emasc /home/fred/mywork.java /tmp/testme.java 

При попытке выполнить emacs на двух вышеуказанных файлах это, очевидно, не удастся. Так что вы можете набрать:

emacs !* 

Это запустит emacs с аргументами, которые вы ввели в командной строке в последний раз. Другими словами, это эквивалентно вводу:

emacs /home/fred/mywork.java /tmp/testme.java

~История командной строки

Связанный контент