У меня есть исполняемый файл, для которого требуется общая библиотека, которая находится в папке /opt/...
. Я включил путь в LD_LIBRARY_PATH
в /etc/environment
и обновил его, используя source /etc/environment
. Когда я запускаю этот исполняемый файл без прав root, я получаю сообщение об ошибке libxxx.so: cannot open shared object file: No such file or directory
. Но когда я запускаю его с sudo
, он запускается. Хотя проблема в том, что лицензия не принадлежит пользователю root, поэтому она выдает ошибку относительно лицензии. Я изменил разрешение для /opt/...
, чтобы обычный пользователь мог создавать и удалять файлы. Хотя это не помогает. Что не так и как мне это исправить?
/etc/environment
интерпретируется при входе в систему. Таким образом, правильный способ увидеть изменения, которые вы внесли в /etc/environment
, - выйти из системы и войти снова.
sudo
работает, потому что частично эмулирует вход в систему как root (sudo -i
эмулирует вход в систему еще более точно).
source /etc/environment
не будет работать, потому что source
- это команда оболочки, которая говорит оболочке интерпретировать данный файл как скрипт оболочки. Проблема в том, что /etc/environment
не является сценарием оболочки. Это список пары переменной среды имя-значение в формате:
name="value"
Эта строка для оболочки является определением глобальной переменной , что видно только по самой оболочке. Программы, выполненные из оболочки, не видят этого. Правильный способ определения переменной среды - использовать команду оболочки export
:
export name="value"
Итак, если вы действительно хотите использовать свой совершенно новый LD_LIBRARY_PATH
без выхода из системы, вы должны выполнить следующую команду вместо source /etc/environment
:
export LD_LIBRARY_PATH="/opt/..."
ОБНОВЛЕНИЕ: LD_LIBRARY_PATH
нельзя установить в /etc/environment
из-за ssh-agent
. Подробности см. В ошибка № 47958 и на вики-странице Ubuntu по переменным среды . Как указано на вики-странице, существует обходной путь, заключающийся в использовании /etc/ld.so.conf.d
.
Например, вы можете создать /etc/ld.so.conf.d/opt.conf
со следующим содержанием:
# Paths for my cool libraries
/opt/...
Хотя это указано в качестве обходного пути, ld.so.conf.d
на самом деле является наиболее подходящим местом для таких настроек.