`type` could be the nightmare of bash completion on macOS

Every time I start a new session in my macOS, it will take a lot of time to initialize the session. After some survey, the key problem is the bash_completion.

A Q&A could be found here.

According to godbyk‘s answer, it seems like the problem is the have function:

# This function checks whether we have a given program on the system.
# No need for bulky functions in memory if we don't.
#
have()
{
unset -v have
# Completions for system administrator commands are installed as well in
# case completion is attempted via `sudo command ...'.
PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin type $1 &>/dev/null &&
have="yes"
}

This checking spends most of the time in the whole progress.

godbyk’s solution is to change this file and comment the PATH=.... type, and it will always return true.

This solution works!

However, changing a configure file managed by brew is not a good idea for me. My solution is:

# Add a function type, which will always return true
function type() { return 0 ; }
# Load bash_completion
if [ -f /usr/local/etc/bash_completion ]; then
source /usr/local/etc/bash_completion
fi
# Remove this function type
unset type

Here is my test:

yu@algac:~$ time . /usr/local/etc/bash_completion

real 0m4.222s
user 0m0.184s
sys 0m0.055s
yu@algac:~$ function type() { return 0 ; }
yu@algac:~$ time . /usr/local/etc/bash_completion

real 0m0.193s
user 0m0.155s
sys 0m0.034s

The time costing reduced from 4.222s to 0.193s!

How could it come? It worked pretty fine in other’s machine.

To reproduce this situation, I checked a lot of factors. It seems like the key problem is the PATH environment.

I changed the PATH environment to reduce search path list. The total time would be very small, even after I removed the workaround for type.