Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save kelvin-mkc/1d1c7e83cad6f7f2cd800635440a7293 to your computer and use it in GitHub Desktop.
Save kelvin-mkc/1d1c7e83cad6f7f2cd800635440a7293 to your computer and use it in GitHub Desktop.
Bash-completion is very slow on MSYS2

Bash-completion is very slow on MSYS2

Bash-completion is very slow on MSYS2 when the current user is a domain user. This describes the cause and the solutions.

Cause

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.

Solution 1: Disable ~* in bash_completion

~* 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

Solution 2: Disable db in /etc/nsswitch.conf

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:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment