Preciso executar o comando do root
usuário, mas no gameservice
usuário. Infelizmente, o diretório bin PATH
não está hidratado NVM
e, portanto, node
não é um comando.
Consegui fazer funcionar exportando PATH
diretamente no comando assim, mas é feio.
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"
Mas quando tento brincar com as coisas, posso provar que tanto os meus arquivos .profile
quanto os meus .bashrc
são executados.
Se eu apenas fizer login como usuário de root
e su gameservice -l
, echo $PATH
tenho o diretório nvm bin dentro.
Acho que estou perdendo alguns conhecimentos básicos de como o bash está funcionando. Alguém pode identificar meu erro, por favor?
Responder1
O problema aqui é que bash
ele é invocado como um shell não interativo. De acordo com a bash
página de manual:
Um shell interativo é iniciado sem argumentos sem opção (a menos que -s seja especificado) e sem a opção -c cuja entrada padrão e erro estão conectados aos terminais (conforme determinado por isatty(3)), ou iniciado com o - eu opção. PS1 está definido e $- inclui i se o bash for interativo, permitindo que um script de shell ou um arquivo de inicialização teste esse estado.
No Ubuntu, o padrão .bashrc
começa com estas linhas:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
então .bashrc
é executado, mas decide sair imediatamente. Se você remover essas linhas, a PATH
variável será definida como o que está no .bashrc
arquivo e você poderá executar o node
comando.
Uma abordagem melhor, na minha opinião, é escrever um script no qual você configura todo o ambiente necessário, executa o comando necessário e, em seguida, executa esse script em nome do usuário. Isso funcionará de qualquer maneira e você não dependerá de nenhum arquivo de inicialização no diretório do usuário.