Назад | Перейти на главную страницу

Команда показывает разные результаты, когда я вхожу в систему как пользователь, а не su пользователю

Я пытаюсь запустить простую команду из сценария 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.