Skip to content

Instantly share code, notes, and snippets.

@k-takata
Created May 13, 2015 15:08
Show Gist options
  • Save k-takata/9b8d143f0f3fef5abdab to your computer and use it in GitHub Desktop.
Save k-takata/9b8d143f0f3fef5abdab 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

If you don't update /etc/passwd and /etc/group properly, bash prompt might show your account as Unknown+User.

See also:

@Kreijstal
Copy link

I've followed this and does not work for me. Everything in shell is still very slow. :(

same

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