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:
> !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!
About the author
I'm currently working on short form content at ClickHouse. I publish short 5 minute videos showing how to solve data problems on YouTube @LearnDataWithMark. I previously worked on graph analytics at Neo4j, where I also co-authored the O'Reilly Graph Algorithms Book with Amy Hodler.