Подтвердить что ты не робот

Повторить последнюю команду с "sudo"

Я часто забываю запускать команды с sudo. Я ищу способ сделать функцию bash (или псевдоним) для повторения последней команды с помощью sudo. Что-то вроде:

S() {
    sudo $(history 1)
}

Любые идеи?

4b9b3361

Ответ 2

Не хватает?

sudo !!

если вы хотите просто поставить S:

alias S=sudo

и используйте его

S !!

!! означает last command

Ответ 3

Используйте alias redo='sudo $(history -p !!)'. Это единственное, что я обнаружили, что работает с псевдонимами. Другие ответы не работают в псевдонимах по какой-то причине, сами пробовав их, даже если они работают при прямом запуске.

Ответ 4

!! может использоваться для ссылки на последнюю команду. Итак:

sudo !!

Ответ 5

Добавление и расширение ответа aaron franke(который является правильным, но без причины), так что простой ввод redo работает после настройки псевдонима alias redo='sudo $(history -p !!);

Это единственное, что я нашел, что работает с псевдонимами

Есть несколько вещей, объясняющих это оправдание.

alias redo='sudo !!'

не работает, так как не выполняет часть sudo, хотя и разрешает !!.

Чтобы правильно разрешить sudo !!, необходимо выполнить и объединить директиву разрешения оболочки вместе с sudo. Так и делаем;

alias redo='sudo $(history -p !!)'

Указав правую часть псевдонима для $(history -p !!), это скажет оболочке;

  1. redo является псевдонимом, оцените правую часть =
  2. sudo остается как есть и соединяется с...
  3. $() является директивой оболочки, предназначенной для выполнения содержимого в текущем процессе выполнения (в отличие от вложенной оболочки ${}, которая порождает другой процесс для выполнения внутри)
  4. Разрешить history -p !!
  5. !! расширяется до history -p <lastCommandHere> в результате шага 4.
  6. Часть -p говорит history только печатать результаты, а не выполнять
  7. sudo выполняет оставшиеся (теперь распечатанные в той же командной строке) с повышенными привилегиями, при условии, что пароль был введен правильно

В конечном итоге это означает, что команда history -p !! эффективно записывает разрешение, а не выполняется после sudo.

ПРИМЕЧАНИЕ: ' имеет большое значение. Если вы используете ", !! дважды интерполируется, и для достижения нашей цели нам нужно очень тщательно контролировать этапы разрешения; одинарные/двойные кавычки в bash

PS

Если вы используете zsh + oh-my-zsh, существует настройка псевдонима sudo для _, которую вы можете сделать;

_ !!

Который перезапустит последнюю команду как sudo. Однако, если вы настраиваете псевдоним в ~/.zshrc, alias redo='sudo $(history -p !!) не будет работать как есть в конфигурации zsh, поскольку шаги разрешения отличаются.

Тем не менее, вы можете поместить псевдоним в ~/.bashrc вместо ~/.zshrc и получить тот же результат при выполнении псевдонима redo из zsh (при условии, что вы используете подшитое zsh из bash, хотя это, правда, немного кладжа - хоть и функциональная).