Я часто забываю запускать команды с 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, хотя это, правда, немного кладжа - хоть и функциональная).