Как я могу `alias sudo !!`?

50

Я пытаюсь установить псевдоним для sudo !!Bash. Я пытался alias sbb='sudo !!, но это интерпретирует это как буквальное !!и печатает

sudo: !!: command not found

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

Есть ли способ сделать эту работу? Или альтернативный псевдоним? `

Manishearth
источник
См. Также Выполнение строки команд с одним sudo
Жиль "ТАК - перестань быть злым"
То же самое можно сделать и в SU: superuser.com/questions/240180/…
Сиро Сантилли,

Ответы:

61

!!расширяется bash при вводе. Он не расширяется путем подстановки псевдонимов.

Вы можете использовать historyвстроенный, чтобы сделать расширение:

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

Если команда больше, чем простая команда (например, она содержит перенаправления или каналы), вам нужно вызвать оболочку под sudo:

alias sbb='sudo "$BASH" -c "$(history -p !!)"'
RICi
источник
Есть один для tcsh?
mdpc
1
@mdpc: я не использую tcsh, но я взглянул man tcshи обнаружил, что он выполняет расширение истории при расширении псевдонима, «как будто исходная команда была предыдущей строкой ввода». Интересно. Тем alias sbb 'sudo \!-2не менее, не сработало, как ожидалось (это фактически заменило вторую предыдущую запись); alias sbb 'sudo \!\!'сделал работу , как и ожидалось (замещенный sbbна !!); и в конце концов оказалось, что я хотел alias sbb 'sudo \!-1'получить то же самое, что и я \!\!. (tcsh 6.17.06 (Astron) 2011-04-15) YMMV. Удачи.
Ричи
Спасибо! Этот псевдоним хорош, когда вы как администратор забыли поставить sudo перед вашей командой.
mdpc
вместо этого sbbя бы предпочел preaseпсевдоним, предложенный @jpschorr
rubo77
40

Пытаться:

alias sbb='sudo $(fc -ln -1)'

Я на самом деле предпочитаю называть это «пожалуйста»:

alias please='sudo $(fc -ln -1)'

Информация: fcвстроенная команда в оболочке bash. который перечисляет, редактирует и повторно выполняет команды, ранее введенные в интерактивную оболочку.

jpschorr
источник
13
pleaseэто определенно путь!
Anto
работает и для bash, поэтому удалил комментарий «для zsh».
Майкл Даррант
1
Хорошо работает в Zsh. fc - это команда для использования. Спасибо
Frax
pleaseмне кажется, что терминал - это сущность, с которой мне нужно быть милой , чтобы все было сделано. Я предпочитаю что-то, что дает лучшее чувство контроля - как fuck;)
Przemek D
5

Теперь в GitHub есть репозиторий для этой цели, он волшебным образом проверяет, нужны ли ему права суперпользователя, а также исправляет опечатки:

https://github.com/nvbn/thefuck

Арда
источник
Я пробовал, apt-get install thefuckкоторый существует, но он не работает на моем Ubuntu 15.10; (
rubo77
0

Первоначально это было размещено на этот вопрос, но позже предложено разместить здесь.

Вот как вы можете использовать fcи historyс псевдонимом для !-подобных замен. Предположим, что если вы хотите использовать !-n(где n - цифра для n- й последней использованной команды), то вы можете использовать fcи historyс псевдонимом следующим образом:

  1. Использование history:

    alias xyz='echo $(history -p "!-<n>") ; sudo $(history -p "!-n")'

    Примечание: здесь !-nдолжно быть приложено 'или ''.

  2. Использование fc:

    alias xyz='echo $(fc -ln -n -n) ; sudo $(fc -ln -n -n)'

    Примечание: здесь 1- й и 2- й -n используются для указания диапазона списка истории.

Здесь я использовал echo-ing перед выполнением команды для рубки вроде !-<n>.

Pandya
источник
Предыдущие ответы уже охватывают history -pи fc. Что-нибудь новое здесь?
Муру
Хорошо, что из этого?
Муру
Я считаю, что -ln -n -nэто сильно сбивает с толку; также немного о 'или ''(а также немного о -<n>).
Скотт
Вариант 2. Должно быть опечатка, я думаю, вы хотите$(fc -ln -1)
cmcginty
-1
alias please="sudo $(history -p \!\-2)"
Антонин ГАВРЕЛЬ
источник