最近安装gitbook时发现不是node版本问题就是npm问题。主要原因是切换版本时环境变量混乱造成。

经过逐步研究排查 在MAC上彻底搞明白每个命令

主要知识点 shell 语法,path加载顺序,不同用户切换shell

shell

shell查看与更改

mac文档

  • 查看当前shell
    echo $SHELL

  • 查看所有shell
    cat /etc/shells 或 chsh -l

/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

  • 切换shell
    方法一: chsh -s /bin/bash
    方法二: usermod -s /bin/bash root 也可以从 系统偏好设置->用户与群组 解锁后 按ctrl点头像出来 高级选项 选择用户默认的shell

表达式

以下主键用于构造表达式:
-b file如果文件存在并且是块特殊文件,则为True。
-c file如果文件存在并且是字符特殊文件,则为True。
-d file如果文件存在并且是目录,则为True。
-e file如果文件存在(无论类型如何),则为True。
-f file如果文件存在并且是常规文件,则为True。
-g file如果文件存在且其设置组ID标志已设置,则为True。
-h file如果文件存在并且是符号链接,则为True。该操作员被保留以与此程序的早期版本兼容。不要依赖其存在;请改用-L。
-k file如果文件存在且其粘性位已设置,则为True。
-n string如果字符串长度为非零,则为True。
-p file如果文件是命名管道(FIFO),则为True。
-r file如果文件存在且可读,则为True。
-s file如果文件存在且大小大于零,则为True。
-t文件描述符如果文件描述符编号为file_descriptor的文件为打开并与终端相关联
-u file如果文件存在并且设置了其设置的用户ID标志,则为True。
-w file如果文件存在且可写,则为True。True仅表示
-x file如果文件存在且可执行,则为True。True仅表示
-z string如果字符串长度为零,则为True。
-L file如果文件存在并且是符号链接,则为True。
-O file如果文件存在且其所有者与此文件的有效用户id匹配,则为True
-G file如果文件存在且其组与有效组id匹配,则为True
-S file如果文件存在并且是套接字,则为True。

环境变量

大多数开发人员,对环境变量比较混乱,如果安装多个版本node,多个版本PHP时。不知默认使用哪个版本,如何切换版本。
echo $PATH

系统级别的

/etc/profile                                                   
/etc/bashrc 
/etc/paths 
/etc/paths.d/*

用户级别的

~/.zshrc

加载顺序

/etc/profile 中 执行 eval /usr/libexec/path_helper -s 设置PATH 加载 /etc/paths /etc/paths.d/* .zshrc

PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/dds/.nvm/versions/node/v10.17.0/bin"; export PATH;

它读取的目录就是/etc/paths /etc/paths.d and /etc/manpaths.d之中的环境变量设置文件。其中每个文件都是一个程序自己的所需环境变量的路径.

#/Library/Apple/usr/bin

nvm

之所有可以使用nvm这个命令,是因为zsh 中新打开时会执行这个文件,1种是通过插件,1种是通过配置的命里
nvm 是一个Shell函数

方法一

~/.zshrc 中加载插件 nvm
这种方法 会先创建,再执行,创建时会调用 /usr/local/Cellar/nvm/0.39.3/npm.sh

方法二:

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

如果文件不存在的话则无法运行,如果想有这个命里可以用 /usr/local/Cellar/nvm/0.39.3/npm.sh 初始化

核心sh /usr/local/Cellar/nvm/0.39.3/libexec/nvm.sh ,软链成 /usr/local/opt/nvm/libexec/nvm.sh

/usr/local/Cellar/nvm/0.39.3/libexec/nvm.sh 中定义了新的PATH

NEWPATH="$(nvm_strip_path "${PATH}" "/bin")"
  if [ "_${PATH}" = "_${NEWPATH}" ]; then
    if [ "${NVM_SILENT:-0}" -ne 1 ]; then
      nvm_err "Could not find ${NVM_DIR}/*/bin in \${PATH}"
    fi
  else
    export PATH="${NEWPATH}"

/usr/local/Cellar/nvm/0.39.3/npm.sh 也会创建如上连接

➜  ~ cat /usr/local/Cellar/nvm/0.39.3/nvm.sh
# $NVM_DIR should be "$HOME/.nvm" by default to avoid user-installed nodes destroyed every update
[ -z "$NVM_DIR" ] && export NVM_DIR="$HOME/.nvm"
\. /usr/local/Cellar/nvm/0.39.3/libexec/nvm.sh
# "nvm exec" and certain 3rd party scripts expect "nvm.sh" and "nvm-exec" to exist under $NVM_DIR
[ -e "$NVM_DIR" ] || mkdir -p "$NVM_DIR"
[ -e "$NVM_DIR/nvm.sh" ] || ln -s /usr/local/opt/nvm/libexec/nvm.sh "$NVM_DIR/nvm.sh"
[ -e "$NVM_DIR/nvm-exec" ] || ln -s /usr/local/opt/nvm/libexec/nvm-exec "$NVM_DIR/nvm-exec"

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐