Windows – Configure Console2 to open bash in current folder

bashconsole2context menucygwin;windows-registry

I've seen this but it doesn't work for me. I'm not using Git's version of bash but the one that comes with cygwin, so that could be part of the problem. Here is how I have my tab in Console2 set up:

Title: bash.exe
Shell: C:\cygwin\bin\bash.exe --login -i
Startup dir: %HOMEDRIVE%%HOMEPATH%

This is my registry entry:

Directory
    shell
        Console2
            Open Console2 Here
            command
                "C:\Console2\Console.exe" -d "%1"

bash always starts in my home directory instead of the directory I'm clicking on, then I have to cd /cygdrive/d/code … etc. I tried removing the value in the "Startup dir" field, changing it to %1, %1% with no luck.

I also tried this solution but it didn't work for me either:

Title: bash.exe
Shell: C:\cygwin\bin\bash.exe -l

Registry:

Directory
    shell
        Console2
            Open Console2 Here
            command
                "C:\Console2\Console.exe" -d "%V"

The solutions above work for the versions of bash.exe and sh.exe that are included with Git, but not the versions that are included with cygwin for some reason. Still looking for a reason for this.

EDIT

I selected an answer below, but I think the second solution above would have worked if I had created the .profile file in the right folder. I kept trying to create it in my normal home directory instead of the home directory used by cygwin, which is why it never executed the script. This led me to believe that the .profile file was unnecessary. The answer I selected (thanks Hugh!) clearly explains how each of the scripts (.bash_profile, .bash_login, .profile, and .bashrc) are used by bash which helped me figure out that I was putting them in the wrong place.

Best Answer

From the manual,

When Bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists.

/etc/profile by default contains the following code:

# Make sure we start in home unless invoked by CHERE
if [ ! -z "${CHERE_INVOKING}" ]; then
  unset CHERE_INVOKING
else
  cd "${HOME}" || echo "WARNING: Failed attempt to cd into ${HOME}!"
fi

So one solution would be to create a Windows batch file that sets the environment variable CHERE_INVOKING before starting bash. That is not very neat.

Next,

After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable.

These profile scripts by default execute your ~/.bashrc script if it exists. Putting cd - at the end of my .bashrc works for me (with the latest Console2 and Cygwin bash):

echo 'cd -' >> ~/.bashrc

BTW, I invoke Console2 (Console.exe) with no arguments - Windows Explorer ensures that it starts up in the directory that I right-clicked. I'm using XP but I doubt MS would change this behavior in later versions of Windows. I also leave the "startup dir" option blank for my Bash tab.

Related Question