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
+