At the moment bash takes about 2 seconds to load. I have ran bash with -x
flag and I am seeing the output and it seems as though PATH is being loaded many times in cygwin. The funny thing is I use the same file in linux environment, but it works fine, without the reload problem. Could the following cause the problem?
if [ `uname -o` = "Cygwin" ]; then
....
fi
This is really not a problem, because 2 seconds of load time on 2nd-gen i7 processor and SSD is actually normal. The culprit of longer load time than the native linux bash shell is
/etc/bash_completion
which comes as a part of cygwin package. So this is cygwin specific problem. I could be completely wrong here, but from what I can see, each program installed installed via setup is being profiled. More discussion is going on here.I wrote a Bash function named 'minimizecompletion' for inactivating not needed completion scripts.
Completion scripts can add more than one completion specification or have completion specifications for shell buildins, therefore it is not sufficient to compare script names with executable files found in $PATH.
My solution is to remove all loaded completion specifications, to load a completion script and check if it has added new completion specifications. Depending on this it is inactivated by adding .bak to the script file name or it is activated by removing .bak. Doing this for all 182 scripts in /etc/bash_completion.d results in 36 active and 146 inactive completion scripts reducing the Bash start time by 50% (but it should be clear this depends on installed packages).
The function also checks inactivated completion scripts so it can activate them when they are needed for new installed Cygwin packages. All changes can be undone with argument -a that activates all scripts.
This is an example output and the resulting times:
In my case that was windows domain controller. I did this to find the issue:
I started with a simple, windows
cmd.exe
and the, typed this:c:\cygwin\bin\strace.exe c:\cygwin\bin\bash
In my case, I noticed a following sequence:
The key thing was identifying the
client_request::make_request: cygserver un-available
line. You can see, how after that, cygwin tries to fetch every single group from windows, and execution times go crazy.A quick google revealed what a
cygserver
is: https://cygwin.com/cygwin-ug-net/using-cygserver.htmlThe solution was, to run the
cygserver-config
and thennet start cygserver
to start the Windows service. Cygwin startup times dropped significantly after that.I know this is an old thread, but after a fresh install of Cygwin this week I'm still having this problem.
Instead of handpicking all of the bash_completion files, I used this line to implement @me_and's approach for anything that isn't installed on my machine. This significantly reduced the startup time of bash for me.
In
/etc/bash_completion.d
, execute the following:As you've noted in your answer, the problem is Cygwin's bash-completion package. The quick and easy fix is to disable bash-completion, and the correct way to do that is to run Cygwin's setup.exe (download it again if you need to) and select to uninstall that package.
The longer solution is to work through the files in
/etc/bash_completion.d
and disable the ones you don't need. On my system, the biggest culprits for slowing down Bash's load time (mailman, shadow, dsniff and e2fsprogs) all did exactly nothing, since the tools they were created to complete weren't installed.If you rename a file in
/etc/bash_completion.d
to have a.bak
extension, it'll stop that script being loaded. Having disabled all but a select 37 scripts on one of my systems in that manner, I've cut the average time for bash_completion to load by 95% (6.5 seconds to 0.3 seconds).New answer for an old thread, relating to the
PATH
of the original question.Most of the other answers deal with the bash startup. If you're seeing a slow load time when you run
bash -i
within the shell, those may apply.In my case,
bash -i
ran fast, but anytime I opened a new shell (be it in a terminal or in xterm), it took a really long time. Ifbash -l
is taking a long time, it means it's the login time.There are some approaches at the Cygwin FAQ at https://cygwin.com/faq/faq.html#faq.using.startup-slow but they didn't work for me.
The original poster asked about the
PATH
, which he diagnosed usingbash -x
. I too found that althoughbash -i
was fast,bash -xl
was slow and showed a lot of information about thePATH
.There was such a ridiculously long Windows
PATH
that the login process kept on running programs and searching the entirePATH
for the right program.My solution: Edit the Windows
PATH
to remove anything superfluous. I'm not sure which piece I removed that did the trick, but the login shell startup went from 6 seconds to under 1 second.YMMV.