Я часто забываю запускать команды с sudo. Я ищу способ сделать функцию bash (или псевдоним) для повторения последней команды с помощью sudo. Что-то вроде:
S() {
sudo $(history 1)
}
Любые идеи?
Я часто забываю запускать команды с sudo. Я ищу способ сделать функцию bash (или псевдоним) для повторения последней команды с помощью sudo. Что-то вроде:
S() {
sudo $(history 1)
}
Любые идеи?
Вы можете написать:
sudo !!
(см. & sect; 9.3 "Расширение истории" в справочном руководстве Bash.)
Не хватает?
sudo !!
если вы хотите просто поставить S:
alias S=sudo
и используйте его
S !!
!! означает last command
Используйте alias redo='sudo $(history -p !!)'. Это единственное, что я
обнаружили, что работает с псевдонимами. Другие ответы не работают в псевдонимах по какой-то причине, сами пробовав их, даже если они работают при прямом запуске.
!! может использоваться для ссылки на последнюю команду. Итак:
sudo !!
Добавление и расширение ответа aaron franke(который является правильным, но без причины), так что простой ввод redo работает после настройки псевдонима alias redo='sudo $(history -p !!);
Это единственное, что я нашел, что работает с псевдонимами
Есть несколько вещей, объясняющих это оправдание.
alias redo='sudo !!'
не работает, так как не выполняет часть sudo, хотя и разрешает !!.
Чтобы правильно разрешить sudo !!, необходимо выполнить и объединить директиву разрешения оболочки вместе с sudo. Так и делаем;
alias redo='sudo $(history -p !!)'
Указав правую часть псевдонима для $(history -p !!), это скажет оболочке;
redo является псевдонимом, оцените правую часть =sudo остается как есть и соединяется с...$() является директивой оболочки, предназначенной для выполнения содержимого в текущем процессе выполнения (в отличие от вложенной оболочки ${}, которая порождает другой процесс для выполнения внутри)history -p !!!! расширяется до history -p <lastCommandHere> в результате шага 4.-p говорит history только печатать результаты, а не выполнять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, хотя это, правда, немного кладжа - хоть и функциональная).