Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bash snippet in README.md is very slow - here is a faster alternative #3508

Open
akarelas opened this issue Jan 11, 2025 · 3 comments
Open

Comments

@akarelas
Copy link

Operating system and version: Linux with bash and perl interpreter

The bash snippet suggested at https://github.com/nvm-sh/nvm?tab=readme-ov-file#bash is tremendously slow - on every single 'cd' the user types, there is a delay before reaching the target dir, regardless of whether the same or a different version of node needs to be used, and this can be counter-productive and annoying.

This is why I wrote the following .bashrc snippet, which can replace the aforementioned. Nevertheless, it uses Perl (even though it's a .bashrc snippet). However, if you do have Perl installed, it is incredibly faster than the (currently) official one.

cdnvm() {
    command cd "$@" || return $?
    eval $(perl <<'END'
        use File::Basename;
        use Cwd;
        use feature 'say';
        
        my $dir = getcwd;
        while (1) {
            if (-f "$dir/.nvmrc") {
                my $current_v = `node -v` =~ s/^v|\s+\z//gr;
                open my $fh, '<', "$dir/.nvmrc" or die "Couldn't read $dir/.nvmrc: $!";
                my $this_v = <$fh> =~ s/^v|\s+\z//gr;
                if ($this_v ne $current_v) {
                    say 'nvm use';
                }
                last;
            }
            last if $dir eq '/';
            $dir = dirname $dir;
        }
END
    )
}

alias cd='cdnvm'
cdnvm "$PWD" || exit
@ljharb
Copy link
Member

ljharb commented Jan 12, 2025

Given that perl isn't guaranteed to be installed, I'm not sure it makes sense to add this to the readme.

@akarelas
Copy link
Author

Maybe someone or some AI can translate it to bash?

@akarelas
Copy link
Author

Here's a .bashrc snippet without perl that achieves the same thing (It's AI-generated, since my bash skills aren't good enough):

cdnvm() {
    command cd "$@" || return $?
    eval $(bash <<'END'
        dir=$(pwd)
        while true; do
            if [ -f "$dir/.nvmrc" ]; then
                current_v=$(node -v | sed 's/^v//; s/[[:space:]]*$//')
                this_v=$(cat "$dir/.nvmrc" | sed 's/^v//; s/[[:space:]]*$//')
                
                if [ "$this_v" != "$current_v" ]; then
                    echo "nvm use"
                fi
                break
            fi
            
            if [ "$dir" = "/" ]; then
                break
            fi
            
            dir=$(dirname "$dir")
        done
END
    )
}

alias cd='cdnvm'
cdnvm "$PWD" || exit

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants