我需要从root
用户运行命令,但必须在gameservice
用户身上运行。不幸的是,PATH
没有与NVM
bin 目录绑定,因此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
命令。
我认为,更好的方法是编写一个脚本,在其中设置所有必要的环境,并运行所需的命令,然后以用户的名义执行该脚本。无论如何,这都会起作用,并且您不会依赖用户目录中的任何启动文件。