Previously, I tried to use zsh
when I am working, so that my default bash
history will not be filled with project related commands, especially git
commands. Because some of my bash history are useful like ffmpeg
related commands. So, I tried to distinct project work and non-project work with zsh
and bash
, so that they have different shell histories.
However, there are two problems when I use zsh
,
- All my projects use the same zsh history. The old history may be lost if I have too many commands (depends on
HISTSIZE
variable). - zsh is slow with
git
auto-completion.
However, zsh has one thing better than bash, that is, auto-completion navigation. Let’s say your directory has various sub-directories, double tab will bring to directory navigation that can be controlled with arrow keys. This is useful for me to navigate to non-alphabetic directories, like the directory with CJK characters.
Due to the slowness of git auto-completion as mentioned above, I decided to find an alternative solution, so that I can use bash
instead of zsh
, and separate the shell history from non-project work. At the end, I come out with this,
#!/bin/bash # source any shell script, like rvm or nvm touch "$PWD/.bash_history" history -a export HISTFILE="$PWD/.bash_history" history -r export PS1='\[\033[1m\]\u@\h \[\033[0m\]\w$(__git_ps1 " (%s)")\$ ' # custom prompt to differentiate from default prompt
So, add the above content to a file like init.sh
in the project directory. Whenever starting with the project, run
source ./init.sh
Hence, the .bash_history
will be saved and used in the project directory.