Bash: Reusing previous commands
A lot of the time when I’m using the bash shell I want to re-use commands that I’ve previously entered and I’ve recently learnt some neat ways to do this from my colleagues Tom and Kief.
If we want to list the history of all the commands we’ve entered in a shell session then the following command does the trick:
> history ... 761 sudo port search pdfinfo 762 to_ipad andersen-phd-thesis.pdf 763 vi ~/.bash_profile 764 source ~/.bash_profile 765 to_ipad andersen-phd-thesis.pdf 766 to_ipad spotify-p2p10.pdf 767 mkdir LinearAlgebra
If we want to execute any of those commands again then we can do that by entering ![numberOfCommand. For example, to execute the last command on that list we’d do this:
> !767 mkdir LinearAlgebra mkdir: LinearAlgebra: File exists ~~~ We can also search the history and execute the last command that matches the search by doing the following: ~~~text > !mk mkdir LinearAlgebra mkdir: LinearAlgebra: File exists
A safer way to do this would be to suffix that with :p so the command gets printed to stdout rather than executed:
> !mk:p mkdir LinearAlgebra
A fairly common use case that I’ve come across is to search for a file and then once you’ve found it open it in a text editor.
We can do this by using the !! command which repeats the previously executed command:
> find . -iname "someFile.txt" > vi `!!`
We can achieve the same thing by wrapping ‘!!’ inside ‘$()’ as well:
> find . -iname "someFile.txt" > vi $(!!)
Sam Rowe has a cool post where he goes into this stuff in even more detail.
I’m sure there are more tricks that I haven’t learnt yet so please let me know if you know some!