Bash-completion is very slow on MSYS2 when the current user is a domain user. This describes the cause and the solutions.
Expansion of ~*
is very slow when you use a domain user. For example:
$ time echo ~*
~*
real 0m23.151s
user 0m0.000s
sys 0m0.000s
When the tab key is pressed, bash-completion tries to evaluate ~*
. That's
why bash-completion is slow.
~*
is used inside /usr/share/bash-completion/bash_completion
.
Disabling it can solve the problem.
--- /usr/share/bash-completion/bash_completion.org
+++ /usr/share/bash-completion/bash_completion
@@ -542,9 +542,9 @@
elif [[ $1 == \'* ]]; then
# Leave out first character
printf -v $2 %s "${1:1}"
- elif [[ $1 == ~* ]]; then
- # avoid escaping first ~
- printf -v $2 ~%q "${1:1}"
+ #elif [[ $1 == ~* ]]; then
+ # # avoid escaping first ~
+ # printf -v $2 ~%q "${1:1}"
else
printf -v $2 %q "$1"
fi
MSYS2 obtains the user information from the system database (in Windows) by default, but it is very slow when the current user is a domain user. Disabling it and make MSYS2 to obtain the user information from files solves the problem.
First you need to create /etc/passwd
and /etc/group
with the information
of the local users (-l
) and the current (domain) user (-c
).
$ mkpasswd -l -c > /etc/passwd
$ mkgroup -l -c > /etc/group
Then you need to modify /etc/nsswitch.conf
to disable db
from group
and
passwd
.
--- /etc/nsswitch.conf.org
+++ /etc/nsswitch.conf
@@ -1,7 +1,7 @@
# Begin /etc/nsswitch.conf
-passwd: files db
-group: files db
+passwd: files #db
+group: files #db
db_enum: cache builtin
This can be done with sed.
$ sed -E -e 's/^(passwd:).*/\1 files # db/' -i'' '/etc/nsswitch.conf'
$ sed -E -e 's/^(group:).*/\1 files # db/' -i'' '/etc/nsswitch.conf'
If you don't update /etc/passwd
and /etc/group
properly, bash prompt might
show your account as Unknown+User
.
See also:
man 5 nsswitch.conf
on Linux- msys2/MSYS2-packages#138 (comment)