在执行 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 # 修改为不重置环境
|