Я пытаюсь запустить простую команду из сценария init.d и устраняю неполадки, почему команда не работает, когда я запускаю ее из сценария init.d, но работает, когда я запускаю ее как пользователь.
Может кто-нибудь объяснить, почему, когда я бегу nvm --version
как мой зарегистрированный пользователь, он показывает значение, но когда я su
для моего пользователя он не знает, что nvm
является? Я считаю, что в конечном итоге это основная причина того, что мой сценарий init.d не работает.
$ whoami
someuser
someuser@node-server1:/var/www/dev$ nvm --version
0.18.0
someuser@node-server1:/var/www/dev$ su - someuser -c "nvm --version"
Password:
-su: nvm: command not found
Я заметил это в своем .bashrc:
export NVM_DIR="/home/someuser/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm
Мне как-то нужно запускать это как команду в моем сценарии init.d или когда я su
пользователю?
Это потому, что пользователь someuser $PATH
нет пути, где nvm
двоичный файл находится. Чтобы иметь возможность использовать команду nvm
вам нужно добавить местоположение nvm
двоичный файл на путь этого пользователя.
Сделай это:
Бегать which nvm
как пользователь, для которого nvm
команда в настоящее время доступна. Если покажет вам, где nvm
команда находится. Например, если which nvm
дает тебе /usr/local/nvm/bin/nvm
, тогда вам нужно добавить /usr/local/nvm/bin
на путь пользователя, где nvm
в настоящее время недоступен. Для этого добавьте следующую строку в .bashrc нового пользователя.
export PATH=$PATH:/usr/local/nvm/bin
Как только все будет готово, выйдите из системы, войдите снова или source
файл .bashrc и nvm
команда будет доступна новому пользователю.
Например: Если у пользователя abc нет доступного nvm, добавьте export PATH...
строка в /home/abc/.bashrc
Из документации NVM:
Чтобы активировать nvm, вам нужно получить его из своей оболочки:
source ~/.nvm/nvm.sh
Итак, да, чтобы иметь возможность использовать nvm, вы должны сначала "активировать" его, прежде чем вызывать.
Где находится программа nvm? Чтобы узнать это, вы можете ввести whereis nvm
. Похоже, этот каталог добавлен к пути где-то внутри вашего файла .bashrc.
Вы должны знать, что "su -c" запускает неинтерактивную оболочку. Вы можете проверить это, просмотрев содержимое $ - переменной:
# echo $-
himBH
# su -c 'echo $-' - $USER
Mot de passe :
hBc
«I» означает, что оболочка в настоящее время интерактивна. Что ж, в ubuntu вы можете заметить, что ваш файл .bashrc начинается с этих нескольких строк:
case $- in
*i*) ;;
*) return;;
esac
Это означает, что этот файл не получен, если переменная $ - не содержит 'i', то есть в неинтерактивной оболочке.
У вас есть два возможных обходных пути:
1- Запустите nvm с командой sudo вместо su:
# sudo -u $USER echo $-
himBH
Обратите внимание, что из-за поведения sudo вы не должны использовать кавычки.
2- Используйте полный путь nvm к двоичному файлу и укажите необходимый файл:
# su -c 'source $HOME/.nvm/nvm.sh; /path/to/nvmdir/nvm --version' - $USER
С помощью nvm
вместо полного пути /path/to/nvmdir/nvm
может быть достаточно, если $ HOME / .nvm / nvm.sh обновляет ваш $ PATH.