Merge pull request #491 from creationix/nvm_exec
Add `nvm exec` command.
diff --git a/README.markdown b/README.markdown
index 4c2995d..03805f8 100644
--- a/README.markdown
+++ b/README.markdown
@@ -38,7 +38,7 @@
## Usage
You can create an `.nvmrc` file containing version number in the project root directory (or any parent directory).
-`nvm use`, `nvm install`, and `nvm run` will all respect an `.nvmrc` file.
+`nvm use`, `nvm install`, `nvm exec`, and `nvm run` will all respect an `.nvmrc` file.
To download, compile, and install the latest v0.10.x release of node, do this:
@@ -52,6 +52,10 @@
nvm run 0.10 --version
+Or, you can run any arbitrary command in a subshell with the desired version of node:
+
+ nvm exec 0.10 node --version
+
If you want to see what versions are installed:
nvm ls
diff --git a/nvm.sh b/nvm.sh
index 2ef65bd..e9de28c 100644
--- a/nvm.sh
+++ b/nvm.sh
@@ -639,6 +639,29 @@
echo "Running node $VERSION"
NODE_PATH=$RUN_NODE_PATH $NVM_DIR/$VERSION/bin/node "$@"
;;
+ "exec" )
+ shift
+
+ local provided_version
+ provided_version=$1
+ if [ -n "$provided_version" ]; then
+ VERSION=`nvm_version $provided_version`
+ if [ $VERSION = "N/A" ]; then
+ provided_version=''
+ nvm_rc_version
+ VERSION=`nvm_version $NVM_RC_VERSION`
+ else
+ shift
+ fi
+ fi
+
+ if [ ! -d "$NVM_DIR/$VERSION" ]; then
+ echo "$VERSION version is not installed yet" >&2
+ return 1
+ fi
+ echo "Running node $VERSION"
+ NODE_VERSION=$VERSION $NVM_DIR/nvm-exec "$@"
+ ;;
"ls" | "list" )
local NVM_LS_OUTPUT
local NVM_LS_EXIT_CODE
diff --git "a/test/slow/nvm exec/Running \"nvm exec 0.x\" should work" "b/test/slow/nvm exec/Running \"nvm exec 0.x\" should work"
new file mode 100755
index 0000000..7798d79
--- /dev/null
+++ "b/test/slow/nvm exec/Running \"nvm exec 0.x\" should work"
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+die () { echo $@ ; exit 1; }
+
+. ../../../nvm.sh
+
+nvm use 0.10
+NPM_VERSION_TEN="$(npm --version)"
+
+nvm use 0.11.7 && [ "$(node --version)" = "v0.11.7" ] || die "\`nvm use\` failed!"
+
+[ "$(nvm exec 0.10 npm --version | tail -1)" = "$NPM_VERSION_TEN" ] || die "`nvm exec` failed to run with the correct version"
+
diff --git "a/test/slow/nvm exec/Running \"nvm exec\" should pick up .nvmrc version" "b/test/slow/nvm exec/Running \"nvm exec\" should pick up .nvmrc version"
new file mode 100755
index 0000000..203cd9a
--- /dev/null
+++ "b/test/slow/nvm exec/Running \"nvm exec\" should pick up .nvmrc version"
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+die () { echo $@ ; exit 1; }
+
+. ../../../nvm.sh
+
+nvm use 0.10.7
+NPM_VERSION_TEN="$(npm --version)"
+
+nvm use 0.11.7 && [ "$(node --version)" = "v0.11.7" ] || die "\`nvm use\` failed!"
+
+echo "0.10.7" > .nvmrc
+
+[ "$(nvm exec npm --version | tail -1)" = "$NPM_VERSION_TEN" ] || die "\`nvm exec\` failed to run with the .nvmrc version"
+
+[ "$(nvm exec npm --version | head -1)" = "Found '$PWD/.nvmrc' with version <0.10.7>" ] || die "\`nvm exec\` failed to print out the \"found in .nvmrc\" message"
+
diff --git a/test/slow/nvm exec/setup_dir b/test/slow/nvm exec/setup_dir
new file mode 100755
index 0000000..a5fc4bc
--- /dev/null
+++ b/test/slow/nvm exec/setup_dir
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+. ../../../nvm.sh
+nvm install 0.10.7
+nvm install 0.11.7
+
+if [ -f ".nvmrc" ]; then
+ mv .nvmrc .nvmrc.bak
+fi
+
diff --git a/test/slow/nvm exec/teardown_dir b/test/slow/nvm exec/teardown_dir
new file mode 100755
index 0000000..a6b923c
--- /dev/null
+++ b/test/slow/nvm exec/teardown_dir
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+. ../../../nvm.sh
+nvm uninstall v0.10.7
+nvm uninstall v0.11.7
+
+rm .nvmrc
+
+if [ -f ".nvmrc.bak" ]; then
+ mv .nvmrc.bak .nvmrc
+fi
+