在执行 npm 时,系统会在 PATH 中寻找第一个匹配到的 npm 位置,此位置和 which npm 得到的结果相同。
然而,在执行 sudo npm 时,系统的环境变量会默认重置为 secure_path ,执行 sudo -l 可以查看 sudo 受到的限制。结果最后一行便是使用 sudo 时的环境变量。
1 2 3 4 5 6
| $ sudo -l Matching Defaults entries for root on this host: !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
|
因此,自己在环境变量中已设置的但不在以上位置的命令将会失效。
解决方法有两种:
将需要用到的命令软链到上述文件夹中
修改配置,使 sudo 切换时不重置环境变量
1 2 3 4
| $sudo visudo # Defaults env_reset # 注释掉原有配置 # Defaults env_keep="…" # 注释掉指定的变量保持 Defaults !env_reset # 修改为不重置环境
|