Ich muss den Befehl vom root
Benutzer, aber auf gameservice
dem Benutzer ausführen. Leider PATH
ist das nicht mit NVM
dem Bin-Verzeichnis verknüpft und daher node
kein Befehl.
Ich habe es geschafft, es zum Laufen zu bringen, indem ich es PATH
direkt im Befehl exportiert habe, aber es ist hässlich.
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"
Aber wenn ich versuche, mit Sachen zu spielen, kann ich beweisen, dass sowohl meine .profile
als auch meine .bashrc
Dateien ausgeführt werden.
root
Wenn ich mich einfach als Benutzer von mit su gameservice -l
und anmelde echo $PATH
, befindet sich das NVM-Bin-Verzeichnis darin.
Ich glaube, mir fehlen einfach einige grundlegende Kenntnisse zur Funktionsweise von Bash. Kann bitte jemand meinen Fehler finden?
Antwort1
Das Problem hierbei ist, dass bash
es als nicht interaktive Shell aufgerufen wird. Laut Manpage bash
:
Eine interaktive Shell wird ohne Argumente ohne Optionen (es sei denn, -s ist angegeben) und ohne die Option -c gestartet, deren Standardeingabe und -fehler beide mit Terminals verbunden sind (wie von isatty(3) bestimmt), oder mit der Option -i gestartet. PS1 ist gesetzt und $- enthält i, wenn Bash interaktiv ist, sodass ein Shell-Skript oder eine Startdatei diesen Status testen kann.
Unter Ubuntu .bashrc
beginnt der Standard mit diesen Zeilen:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
wird also .bashrc
ausgeführt, beschließt aber, sofort zu beenden. Wenn Sie diese Zeilen entfernen, PATH
wird die Variable auf den Inhalt der .bashrc
Datei gesetzt und Sie können den node
Befehl ausführen.
Ein besserer Ansatz ist meiner Meinung nach, ein Skript zu schreiben, in dem Sie die gesamte erforderliche Umgebung einrichten, den benötigten Befehl ausführen und das Skript dann im Namen des Benutzers ausführen. Dies funktioniert in jedem Fall und Sie sind nicht von Startdateien im Verzeichnis des Benutzers abhängig.