Повторить предыдущую команду под sudo

8

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

Вот что я хочу сделать в терминале:

$ run command
"you don't have access to do that"
$ please
"ran successfully"

Я видел, что !!это захватит предыдущую команду, поэтому я думал, что смогу использовать это, но не могу заставить ее работать.

Мой скрипт оболочки please.sh выглядит следующим образом, но я не могу заставить все это работать. Он просто говорит "команда не найдена !!" и распечатывает использование sudo.

#!/bin/zsh

#sudo !!
#sudo `!!`
sudo $(!!)
ДБ.
источник
Работает ли без скрипта? Если вы просто запустите sudo !!, он будет работать, как ожидалось? Я думаю !! может быть просто псевдонимом bash, поэтому он может не работать в zsh
Крис Уэйн
3
AFAIK, расширение истории ( !!и другие) работает только в интерактивных оболочках, а не в скриптах.
Тор
sudo !!в интерактивном режиме практически работает как положено. когда я нажал Enter, он заменил !!бы предыдущей командой. Затем мне пришлось снова нажать Enter, чтобы запустить его.
JB.

Ответы:

6

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

#!/bin/bash
sudo `cat $HOME/.bash_history | tail -n1`

Это определенно НЕ идеальное решение, но оно должно сработать. Если вы используете ZSH, это не будет работать, так как ZSH не выводит в .bash_history (насколько я знаю). ОБНОВЛЕНИЕ : Вот версия, которая должна работать с ZSH:

#!/usr/bin/zsh
. $HOME/.zshrc
sudo `cat \`readlink -f $HISTFILE\` | tail -n1`

Надеюсь это поможет!

Если вы не понимаете скрипт, он просто запускает последнюю команду, введенную в BASH, с помощью sudo.

MiJyn
источник
Хорошо. Я использую Zsh, хотя. есть ли эквивалент для .bash_history в Zsh?
JB.
Теперь, когда я смотрю, да, есть версия, которая должна работать. Я еще не проверял это все же.
MiJyn
Не читайте файл истории bash напрямую. Используйте fcили historyвстроенные модули. По умолчанию $ HISTFILE не обновляется, пока вы не выйдете из bash.
Стивен К
24

Добавьте к вашему .zshrc:

alias please='sudo $(fc -ln -1)'
jpschorr
источник
Работает лакомство, кажется лучше принятого выше ответа для простоты использования.
Митчелл Керри
2
Для любопытных: fcобозначает команду fix. Документация здесь .
dshepherd
Спасибо! Я знаю , что это AskUbuntu, но я использовал это на OSX , чтобы скопировать мою последнюю команду в буфер обмена: alias lastcmd="fc -ln -1 | pbcopy"Я считаю , что это должно работать на Ubuntu (?): alias lastcmd="fc -ln -1 | xclip -selection clipboard.
HellaMad