su user -l 和 su user -l -c "cmd" 不会给出相同的结果

su user -l 和 su user -l -c "cmd" 不会给出相同的结果

我需要从root用户运行命令,但必须在gameservice用户身上运行。不幸的是,PATH没有与NVMbin 目录绑定,因此node不是命令。

PATH我已设法通过像这样直接在命令中导出来使其工作,但它很丑陋。

su gameservice -l -c "export PATH='$PATH:/home/gameservice/.nvm/versions/node/v13.7.0/bin/' && cd universalgame-server && ./node_modules/.bin/babel src -d dist --source-maps"

但是当我尝试玩一些东西时,我可以证明我.profile和我的.bashrc文件都被执行了。

root如果我只是以用户身份登录,su gameservice -l那么echo $PATH里面就有 nvm bin 目录。

我想我只是缺少一些关于 bash 如何工作的基本知识,有人能发现我的错误吗?

答案1

这里的问题是,它bash被调用为非交互式 shell。根据bash手册页:

交互式 shell 是指不使用非选项参数(除非指定了 -s)和 -c 选项启动的 shell,其标准输入和错误均连接到终端(由 isatty(3) 确定),或使用 -i 选项启动的 shell。如果 bash 是交互式的,则设置 PS1 并且 $- 包含 i,从而允许 shell 脚本或启动文件测试此状态。

在 Ubuntu 中,默认.bashrc以这些行开始:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

so.bashrc确实执行了,但决定立即退出。如果删除这些行,变量PATH将设置为.bashrc文件中的内容,您将能够运行该node命令。

我认为,更好的方法是编写一个脚本,在其中设置所有必要的环境,并运行所需的命令,然后以用户的名义执行该脚本。无论如何,这都会起作用,并且您不会依赖用户目录中的任何启动文件。

相关内容