Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save thomthom/d69d82b2f5fc10bb28f47c2d16f74057 to your computer and use it in GitHub Desktop.

Select an option

Save thomthom/d69d82b2f5fc10bb28f47c2d16f74057 to your computer and use it in GitHub Desktop.

Revisions

  1. @k-takata k-takata created this gist May 13, 2015.
    86 changes: 86 additions & 0 deletions bash-completion-slowness-on-msys2.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,86 @@
    # 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.

    ```diff
    --- /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`).

    ```sh
    $ 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`.

    ```diff
    --- /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:
    * `man 5 nsswitch.conf` on Linux
    * https://github.com/Alexpux/MSYS2-packages/issues/138#issuecomment-74079347