Running Almost the Same Command

Problem

After running a long and difficult-to-type command, you get an error message indicating that you made one tiny little typo in the middle of that command line. Do you have to retype the whole line?

Solution

The !! command that we discussed in Repeating the Last Command allows you to add an editing qualifier. How good are your sed-like skills? Add a colon after the bang-bang and then a sed-like substitution expression, as in the following example:

$ /usr/bin/somewhere/someprog -g -H -yknot -w /tmp/soforthandsoon
Error: -H not recognized. Did you mean -A?

$ !!:s/H/A/
/usr/bin/somewhere/someprog -g -A -yknot -w /tmp/soforthandsoon
...

You can always just use the arrow keys to navigate your history and commands, but for long commands on slow links this syntax is great once you get used to it.

Discussion

If you’re going to use this feature, just be careful with your substitutions. If you had tried to change the -g option by typing !!:s/g/h/ you would have ended up changing the first letter g, which is at the end of the command name, and you would be trying to run /usr/bin/somewhere/someproh.

If you want to change all occurrences of an expression in a command line, you need to precede the s with a g (for global substitution), as follows:

$ /usr/bin/somewhere/someprog -g -s -yknots -w /tmp/soforthandsoon
...

$ !!:gs/s/S/
/usr/bin/Somewhere/Someprog -g -S -yknotS -w /tmp/SoforthandSoon
...

Why does this g have to appear before the s and not after it, like in ...

Get bash Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.