Come posso `alias sudo !!`?


50

Sto cercando di impostare un alias per sudo !!in Bash. Ci ho provato alias sbb='sudo !!", ma lo interpreta letteralmente !!e stampa

sudo: !!: command not found

Se uso le virgolette doppie, sostituisce il doppio bang nella stringa stessa, quindi non funziona.

C'è un modo per farlo funzionare? O un alias alternativo? `



Risposte:


61

!!viene espanso da bash quando lo si digita. Non è espanso dalla sostituzione di alias.

È possibile utilizzare il historybuilt-in per eseguire l'espansione:

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

Se il comando è più di un semplice comando (ad esempio contiene reindirizzamenti o pipe), è necessario invocare una shell sotto sudo:

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

Ne hai uno per tcsh?
mdpc,

1
@mdpc: non uso tcsh, ma ho dato un'occhiata man tcshe ho scoperto che fa l' espansione della cronologia durante l'espansione dell'alias "come se il comando originale fosse la precedente riga di input". Interessante. Tuttavia, alias sbb 'sudo \!-2non ha funzionato come previsto (in realtà ha sostituito la seconda voce precedente); alias sbb 'sudo \!\!'ha funzionato come previsto (sostituito sbbper !!); e alla fine si è scoperto che quello che volevo era quello alias sbb 'sudo \!-1'che mi sarei aspettato fosse lo stesso \!\!. (tcsh 6.17.06 (Astron) 15-04-2011) YMMV. In bocca al lupo.
rici,

Grazie! Questo alias è fantastico quando come amministratore ti dimentichi di mettere sudo davanti al tuo comando.
mdpc,

invece di sbbpreferirei preasealias come suggerito da @jpschorr
rubo77

40

Provare:

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

In realtà preferisco chiamarlo "per favore":

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

Informazioni: fcè un comando incorporato nella shell bash. che elenca, modifica e riesegue i comandi precedentemente immessi in una shell interattiva.


13
pleaseè sicuramente la strada da percorrere!
Anto

funziona anche per bash, quindi rimosso il commento 'for zsh'.
Michael Durrant,

1
Funziona bene in zsh. fc è il comando da usare. Grazie
Frax

pleasefa sembrare che il terminale sia un'entità con cui devo essere gentile per fare le cose. Preferisco qualcosa che dia un migliore senso di controllo - come fuck;)
Przemek D


0

Questo è stato originariamente pubblicato su questa domanda, ma in seguito ha suggerito di pubblicare qui.

Ecco come è possibile utilizzare fce historycon alias per !-sostituzioni simili. Supponiamo che tu voglia usare !-n(dove n è la cifra dell'ennesimo comando usato), quindi puoi usare fce historycon lo pseudonimo come segue:

  1. Utilizzando history:

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

    Nota: qui !-ndeve essere incluso con 'o ''.

  2. Utilizzando fc:

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

    Nota: qui 1 ° e 2 ° -n sono utilizzati per specificare l'intervallo di cronologia.

Qui ho usato l'eco prima di eseguire il comando per abbattere come !-<n>.


Le risposte precedenti riguardano già history -pe fc. Qualcosa di nuovo qui?
Muru,

Ok, che ne pensi?
Muru,

Trovo -ln -n -nche sia molto confuso; anche il bit about 'o ''(e anche il bit about -<n>).
Scott,

L'opzione 2. deve essere un refuso, penso che tu voglia$(fc -ln -1)
cmcginty,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.