首页 > 解决方案 > 从脚本安装后,Bash 重新加载以查找可执行文件

问题描述

我正在尝试编写一个小 shell 脚本来安装nvm,然后安装.nvmrc文件中指定的节点版本。的安装nvm似乎成功了,但我无法调用nvm install,因为$(command -v nvm)没有输出。同样在终端中,我从nvm install.sh脚本中得到消息:

=> 关闭并重新打开终端以开始使用 nvm 或运行以下命令以立即使用它:

#!/bin/bash

if ! [ -x "$(command -v nvm)" ]; then
  echo 'Installing Node version manager (http://nvm.sh).' >&2
  curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
fi

source ~/.bash_profile
source ~/.bashrc

if [ -x "$(command -v nvm)" ]; then
  nvm install
  exit
fi
exit 1

如何nvm在 bash 脚本中使用命令?

标签: node.jsbashshellnvm

解决方案


如果您想简单地使用脚本给出的命令修改环境而不重新加载整个配置文件,请使用:

eval "$(curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash | grep -E -v "^.?=>")"

grep=>将删除以潜在隐藏字符 开头的评论。eval将在当前 shell 中执行命令。

然后不要使用-x,因为command -v nvm返回 nvm 而不是完整路径。

if [ -n "$(command -v nvm)" ]; then
  nvm install
  exit $?
fi

并且遵循三元组的建议使用一个bareexit来保留返回码。

脚本变为:

#!/bin/bash

if ! [ -n "$(command -v nvm)" ]; then
  echo 'Installing Node version manager (http://nvm.sh).' >&2
  eval "$(curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash | grep -E -v "^.?=>")"
fi

if [ -n "$(command -v nvm)" ]; then
  nvm install
  exit
fi
exit 1

推荐阅读