Necesito ejecutar el comando desde root
el usuario pero en gameservice
el usuario. Desafortunadamente, el directorio bin PATH
no está hidratado y, por lo tanto, no es un comando.NVM
node
Logré hacerlo funcionar exportando PATH
directamente en el comando de esta manera, pero es feo.
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"
Pero cuando intento jugar con cosas, puedo demostrar que tanto mis archivos .profile
como mis .bashrc
archivos se ejecutan.
Si simplemente inicio sesión como usuario root
con su gameservice -l
y echo $PATH
, tengo el directorio nvm bin dentro.
Creo que me faltan algunos conocimientos básicos sobre cómo funciona bash. ¿Alguien puede detectar mi error, por favor?
Respuesta1
El problema aquí es que bash
se invoca como un shell no interactivo. Según la bash
página de manual:
Un shell interactivo es uno que se inicia sin argumentos que no sean opciones (a menos que se especifique -s) y sin la opción -c cuya entrada estándar y error están conectados a terminales (según lo determinado por isatty(3)), o uno que se inicia con - Yo opción. PS1 está configurado y $- incluye i si bash es interactivo, lo que permite que un script de shell o un archivo de inicio pruebe este estado.
En Ubuntu, el valor predeterminado .bashrc
comienza con estas líneas:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
también .bashrc
se ejecuta, pero decide salir de inmediato. Si elimina esas líneas, la PATH
variable se establecerá en lo que hay en el .bashrc
archivo y podrá ejecutar el node
comando.
En mi opinión, un mejor enfoque es escribir un script en el que configure todo el entorno necesario, ejecute el comando que necesita y luego ejecute ese script en nombre del usuario. Esto funcionará pase lo que pase y no dependerá de ningún archivo de inicio en el directorio del usuario.