Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I often forget to run a command with sudo, so I find myself often typing sudo !! immediately afterwards.

I tried aliasing this, but bash chokes on the !! part. Is there some way to represent this shortcut within an alias?

share|improve this question
That's not a wild-card that's a history expansion feature. History expansion is performed before alias expansion so when the alias is expanded the !! are considered literal. – Dennis Williamson Feb 1 '11 at 1:54
up vote 5 down vote accepted

AIUI the problem is that history substitutions (!!) are done before alias substitution. I haven't tested this thoroughly, but it looks like fc can be used to get what you want:

alias sudothat='eval "sudo $(fc -ln -1)"'
share|improve this answer
No need for the eval (plus it may have some undesirable effects). – Dennis Williamson Feb 1 '11 at 1:38
Without the eval, it won't parse things like the quoted strings correctly, and with double-quotes around the results of fc it should evaluate everything exactly once -- which is what you want. – Gordon Davisson Feb 1 '11 at 3:47
@Dennis Williamson: I've now tested this a bit more thoroughly, and it seems to work as expected (i.e. the same as typing sudo !!) for everything I've tried -- quoted arguments, pipelines, command substitutions, command substitutions containing command substitutions containing pipes... I don't see any way to do this right without an eval. – Gordon Davisson Feb 19 '11 at 15:45

From a colleague at work:

alias sa='sudo `history -p \!\!`'

appears to do the trick

share|improve this answer
it should be noted that this only works when using single quotes ('). – Torian Feb 1 '11 at 3:42
This won't handle quoted arguments properly -- for example, if you use it to rerun echo "a   b" (which prints a   b), it'll print "a b" (as in, the quotes are actually included in the arguments passed to echo, but the spaces between aren't). – Gordon Davisson Feb 1 '11 at 3:50

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .