![当我以用户身份登录和以 su 身份登录时,命令显示的结果不同](https://linux22.com/image/647677/%E5%BD%93%E6%88%91%E4%BB%A5%E7%94%A8%E6%88%B7%E8%BA%AB%E4%BB%BD%E7%99%BB%E5%BD%95%E5%92%8C%E4%BB%A5%20su%20%E8%BA%AB%E4%BB%BD%E7%99%BB%E5%BD%95%E6%97%B6%EF%BC%8C%E5%91%BD%E4%BB%A4%E6%98%BE%E7%A4%BA%E7%9A%84%E7%BB%93%E6%9E%9C%E4%B8%8D%E5%90%8C.png)
我正在尝试从 init.d 脚本运行一个简单命令,并且正在排除故障,为什么当我从 init.d 脚本运行该命令时该命令不起作用,而当我以我的用户身份运行该命令时该命令却起作用。
有人能解释一下为什么当我nvm --version
以登录用户身份运行时会显示一个值,但当我su
以用户身份运行时却不知道是什么nvm
吗?我认为这最终是我的 init.d 脚本无法正常工作的根本原因。
$ whoami
someuser
someuser@node-server1:/var/www/dev$ nvm --version
0.18.0
someuser@node-server1:/var/www/dev$ su - someuser -c "nvm --version"
Password:
-su: nvm: command not found
我在我的.bashrc中注意到了这一点:
export NVM_DIR="/home/someuser/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm
su
我是否需要在我的 init.d 脚本中或者向用户运行它作为命令?
答案1
来自NVM文档:
要激活 nvm,您需要从 shell 中获取它:
source ~/.nvm/nvm.sh
所以,是的,为了能够使用 nvm,您必须先“激活”它,然后才能调用它。
答案2
这是因为“someuser”用户$PATH
没有nvm
二进制文件所在的路径。要使用该命令,nvm
您需要将二进制文件的位置添加nvm
到该用户的路径中。
做这个:
which nvm
以当前命令可用的用户身份运行nvm
。它将向您显示命令nvm
所在的位置。例如,如果which nvm
给出/usr/local/nvm/bin/nvm
,那么您必须将其添加/usr/local/nvm/bin
到当前不可用的用户路径中nvm
。为此,请在新用户的 .bashrc 中添加以下行。
export PATH=$PATH:/usr/local/nvm/bin
完成后,注销,重新登录,或者source
.bashrc 文件和nvm
命令将可供新用户使用。
例如:如果用户“abc”没有可用的 nvm,请将该export PATH...
行添加到 /home/abc/.bashrc
答案3
nvm 程序位于哪里?要找到它,您可以键入whereis nvm
。看起来这个目录被添加到 .bashrc 文件内的某个路径中。
您需要知道的是,“su -c”运行非交互式 shell。您可以通过查看 $- 变量内容来检查这一点:
# echo $-
himBH
# su -c 'echo $-' - $USER
Mot de passe :
hBc
'i' 表示 shell 当前处于交互状态。在 ubuntu 中,您会注意到 .bashrc 文件以以下几行开头:
case $- in
*i*) ;;
*) return;;
esac
这意味着如果 $- 变量不包含“i”(即在非交互式 shell 中),则不会获取此文件。
您有两种可能的解决方法:
1-使用 sudo 命令而不是 su 运行 nvm:
# sudo -u $USER echo $-
himBH
请注意,由于 sudo 的行为,您不能使用引号。
2-使用 nvm 的二进制文件完整路径并获取所需文件:
# su -c 'source $HOME/.nvm/nvm.sh; /path/to/nvmdir/nvm --version' - $USER
如果 $HOME/.nvm/nvm.sh 是更新 $PATH 的路径,则使用nvm
其完整路径可能就足够了。/path/to/nvmdir/nvm