当我以用户身份登录和以 su 身份登录时,命令显示的结果不同

当我以用户身份登录和以 su 身份登录时,命令显示的结果不同

我正在尝试从 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

相关内容