su user -l y su user -l -c "cmd" no dan el mismo resultado

su user -l y su user -l -c "cmd" no dan el mismo resultado

Necesito ejecutar el comando desde rootel usuario pero en gameserviceel usuario. Desafortunadamente, el directorio bin PATHno está hidratado y, por lo tanto, no es un comando.NVMnode

Logré hacerlo funcionar exportando PATHdirectamente 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 .profilecomo mis .bashrcarchivos se ejecutan.

Si simplemente inicio sesión como usuario rootcon su gameservice -ly 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 bashse invoca como un shell no interactivo. Según la bashpá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 .bashrccomienza con estas líneas:

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

también .bashrcse ejecuta, pero decide salir de inmediato. Si elimina esas líneas, la PATHvariable se establecerá en lo que hay en el .bashrcarchivo y podrá ejecutar el nodecomando.

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.

información relacionada