7

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

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

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

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

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

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


Можно ли это сделать, или я сплю?

4 ответа4

16

Просто используйте 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. Если список его значений включает игнорируемое пространство (или ignoreboth), строки, начинающиеся с пробела, не сохраняются в списке истории. Так с sudo !! Вы выполните последнюю команду раньше.

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

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


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

shopt -s histverify

От man bash можно прочитать

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

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

5

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

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

использование

sudo !!

!! будет заменено завершенной предыдущей командой.

3

@WChargin правильно в отношении !sudo , так что я меняю свой ответ ...

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

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


Команда истории

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

Этот журнал называется «история». Для доступа введите:

history n 

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

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

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

!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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .