Jak mogę uzyskać alias sudo !!?

50

Próbuję ustawić alias dla sudo !!w Bash. Próbowałem alias sbb='sudo !!”, ale interpretuje to jako dosłowny !!i drukowany

sudo: !!: command not found

Jeśli użyję podwójnych cudzysłowów, zastępuje podwójny huk w samym ciągu, więc to nie działa.

Czy jest jakiś sposób, aby to zadziałało? Lub alternatywny alias? `

Manishearth
źródło
Zobacz także Wykonaj linię poleceń jednym sudo
Gilles 'SO - przestań być zły'
Możliwe to samo na SU: superuser.com/questions/240180/...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

61

!!jest rozwijany przez bash podczas pisania. Nie jest rozszerzany przez podstawienie aliasu.

Możesz użyć historywbudowanego do rozszerzenia:

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

Jeśli polecenie jest czymś więcej niż prostym poleceniem (np. Zawiera przekierowania lub potoki), musisz wywołać powłokę pod sudo:

alias sbb='sudo "$BASH" -c "$(history -p !!)"'
rici
źródło
Masz jeden na TCSH?
mdpc,
1
@mdpc: Nie używam tcsh, ale spojrzał na man tcshi odkrył, że ma zrobić interpretację historii podczas ekspansji alias „jakby były oryginalne polecenia poprzedniego wiersza wejściowego.” Ciekawy. Jednak alias sbb 'sudo \!-2nie działało zgodnie z oczekiwaniami (faktycznie zastąpiło drugi poprzedni wpis); alias sbb 'sudo \!\!'nie działa prawidłowo (podstawione sbbna !!); i ostatecznie okazało się, że chciałem tego, alias sbb 'sudo \!-1'czego bym się spodziewał \!\!. (tcsh 6.17.06 (Astron) 15.04.2011) YMMV. Powodzenia.
rici
Dzięki! Ten alias jest świetny, gdy jako administrator zapomnisz umieścić sudo przed swoim poleceniem.
mdpc,
zamiast sbbwolałbym preasetak alias jak sugerował @jpschorr
rubo77
40

Próbować:

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

W rzeczywistości wolę nazywać to „proszę”:

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

Informacje: fcto wbudowane polecenie w powłoce bash. która wyświetla, edytuje i ponownie wykonuje polecenia wprowadzone wcześniej w interaktywnej powłoce.

jpschorr
źródło
13
pleaseto zdecydowanie najlepsza droga!
Anto
działa również dla bash, więc usunąłem komentarz „dla zsh”.
Michael Durrant,
1
Działa dobrze w Zsh. fc to polecenie, którego należy użyć. Dzięki
Frax
pleasesprawia wrażenie, jakby terminal był bytem, ​​do którego muszę być miły , aby załatwić sprawę. Wolę coś, co daje lepsze poczucie kontroli - jak fuck;)
Przemek D
5

Teraz w GitHub istnieje repozytorium do tego celu, magicznie sprawdza, czy potrzebuje uprawnień administratora, naprawia także literówki:

https://github.com/nvbn/thefuck

Arda
źródło
Próbowałem, apt-get install thefuckktóry istnieje, ale nie działa na moim Ubuntu 15.10; (
rubo77
0

Zostało to pierwotnie opublikowane na to pytanie, ale później sugerowano opublikowanie tutaj.

Oto w jaki sposób można wykorzystać fci historyz aliasu dla !-podobnych zastępstw. Załóżmy, że jeśli chcesz użyć !-n(gdzie n jest cyfrą dla n- tego ostatniego użytego polecenia), możesz użyć fciz historyaliasem w następujący sposób:

  1. Używanie history:

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

    Uwaga: Tutaj !-nnależy dołączyć 'lub ''.

  2. Używanie fc:

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

    Uwaga: tu 1 st i 2 nd -n służą do określenia zakresu liście historii.

W tym przypadku użyłem echa przed wykonaniem polecenia do wycinki typu like !-<n>.

Pandya
źródło
Poprzednie odpowiedzi już obejmują history -pi fc. Coś tu nowego?
muru
Ok, a co z tego?
muru
Uważam -ln -n -nto za bardzo zagmatwane; także trochę o 'lub ''(a także trochę o -<n>).
Scott
Opcja 2. musi być literówką, myślę, że chcesz$(fc -ln -1)
cmcginty
-1
alias please="sudo $(history -p \!\-2)"
Antonin GAVREL
źródło