Мне нужно запустить команду от 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
вызывается как неинтерактивная оболочка. Согласно bash
man-странице:
Интерактивная оболочка запускается без аргументов non-option (если не указано -s) и без опции -c, стандартный ввод и вывод ошибок которой подключены к терминалам (как определено isatty(3)), или запускается с опцией -i. Устанавливается PS1, а $- включает i, если bash является интерактивной, что позволяет скрипту оболочки или файлу запуска проверять это состояние.
В Ubuntu по умолчанию все .bashrc
начинается со следующих строк:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
so .bashrc
выполняется, но решает сразу же выйти. Если вы удалите эти строки, переменная PATH
будет установлена на то, что находится в .bashrc
файле, и вы сможете выполнить node
команду.
Лучший подход, по моему мнению, это написать скрипт, в котором вы настраиваете всю необходимую среду, и запустить нужную вам команду, а затем выполнить этот скрипт от имени пользователя. Это будет работать в любом случае, и вы не будете зависеть ни от каких файлов запуска в каталоге пользователя.