54

I am trying to write a shell script to automate my dev environment set-up (install python, nvm, node, mongo etc...). I am using nvm to install Node. It tells you to close and reopen your terminal to start using the nmv command. I tried to source .bashrc and .profile to make the command available right away so I can continue running the script with nvm install, but it doesn't work.

Here is the segment of my script related to installing NVM / Node:

#install nvm and latest node version
# sourcing profile and bashrc is not working here. nvm does not execute the next two lines to install node.

wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.2/install.sh | bash
source ~/.profile
source ~/.bashrc
nvm install 5.0
nvm alias default node

I get these messages, but please note that I've already run the script and NVM / Node are already installed and working. I can also use nvm and node in the same terminal I run the script from after it completes. It just doesn't work in the script.

=> Downloading nvm from git to '/home/myDir/.nvm'
=> fatal: destination path '/home/myDir/.nvm' already exists and is not an empty directory.
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git

=> Source string already in /home/myDir/.bashrc
=> Close and reopen your terminal to start using nvm
./install-programs.sh: line 27: nvm: command not found
./install-programs.sh: line 28: nvm: command not found
1

7 Answers 7

99

if you have nvm running on the main shell, you just need to add:

export NVM_DIR=$HOME/.nvm;
source $NVM_DIR/nvm.sh;

in your script

Sign up to request clarification or add additional context in comments.

6 Comments

You went to all of the trouble to create the NVM_DIR directory and then didn't use it! Might I suggest NVM_HOME and then source $NVM_HOME/nvm.sh. Worked great, by the way. Thanks.
I didn't need to export NVM_DIR. Executing just the second line from inside my bash script was enough for nvm to be accessible.
Setting NVM_DIR causes problems if nvm isn't installed into your home dir. For example brew installs nvm into /usr/local. Inheriting NVM_DIR from the parent is probably a more sound approach.
source isn't available in POSIX... use the . if you care about portability to slim linux images like docker alpine or Android termux. This paired wit if [ -f "$NVM_DIR/nvm.sh" ]; then helped me use .nvmrc when available. Here is the gist gist.github.com/simov/cdbebe2d65644279db1323042fcf7624
nvm sets the NVM_DIR in the environment. So I don't need to export it inside the script. I just source it and then use it. source $NVM_DIR/nvm.sh; then nvm use 16
|
35

Here is what worked for me.

First install nvm (once and separately) using SSH or console:

$ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.2/install.sh | bash

Then in your script, loading your profile as follows:

. ~/.nvm/nvm.sh
. ~/.profile
. ~/.bashrc

And with some luck nvm should become available inside the script.

nvm install 4.4.2

Tada!

3 Comments

I put that stuff in the top of my script and voila, perfect.
adding . ~/.nvm/nvm.sh before using it worked for me, thanks!
already installed node versions are not accessible from within bash scripts? i can change and use nvm, but says that not installed even though the same command works in terminal directly.
13

Just put this on top of your script:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

Worked like a charm here.

Comments

5

Nowadays, you can simply do this:

env NODE_VERSION=<dd> /home/<user>/.nvm/nvm-exec npm run front

Simply sourcing nvm.sh didn't work for me (from a systemd .service file), the PATH didn't include ~/.nvm...

Credit where credit is due: https://gist.github.com/joepie91/73ce30dd258296bd24af23e9c5f761aa#gistcomment-2215867

Comments

3

This script works fine for me:

#!/usr/bin/env bash

if [ ! -d ~/.nvm ]; then

  curl https://raw.githubusercontent.com/creationix/nvm/v0.11.1/install.sh | bash
  source ~/.nvm/nvm.sh
  source ~/.profile
  source ~/.bashrc
  nvm install 5.0
  npm install
  npm run front
fi

Comments

0

Make sure NVM is installed in the server/your machine Modify your shell script in the following format, the shell script we have used uses two different node versions in client and in server. Please check whether this works for you?

echo "Removing build files..";
rm -rf server/public/build
echo "Generating New Build....";
source $NVM_DIR/nvm.sh;
cd client
nvm use 14.16.1;
echo "Building Application";
npm install --legacy-peer-deps;
npm run build
echo "Building App Ends";
cd ..
nvm use 16.13.0;
npm install --legacy-peer-deps

Comments

0

I found this link helpful: NVM. We need to find which shell we are using.

This below script worked for me.


echo "starting redis required for backend";
pm2 start "redis-server" --name redis_c

# source ~/.bashrc
. ~/.profile

cd project_dir;
echo "inside project_dir";

nvm use;
git pull origin main;


.... more scripts.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.