У меня есть сценарий оболочки для установки некоторых переменных среды и запуска любой программы, которую я посылаю в качестве аргумента:
export PATH=$HOME/local/bin:$PATH
export LD_LIBRARY_PATH=$HOME/local/lib:$LD_LIBRARY_PATH
export TESTER="MY TEST VAR"
$@
Когда я использую это для вызова, bash
например, это работает:
kjfletch@flatbed:~$ envrun.sh bash
kjfletch@flatbed:~$ echo $LD_LIBRARY_PATH
/home/kjfletch/local/lib:
kjfletch@flatbed:~$ echo $TESTER
MY TEST VAR
Когда я использую его для вызова терминала ( xterm
, aterm
, ...) моя LD_LIBRARY_PATH
получает снята с охраны:
kjfletch@flatbed:~$ echo $LD_LIBRARY_PATH
kjfletch@flatbed:~$ echo $TESTER
MY TEST VAR
Почему это происходит? Как я могу это остановить? (Я использую Debian 5.0)
Обновить
Мой терминал не вызывает bash в качестве логина:
kjfletch@flatbed:~$ echo $0
bash
My LD_LIBRARY_PATH
не отображается ни в одном из файлов запуска bash (кроме .bash_history и ~ / .profile не существует.):
kjfletch@flatbed:~$ grep "LD" ~/.bash*
kjfletch@flatbed:~$ grep "LD" /etc/bash.bashrc
kjfletch@flatbed:~$ grep "LD" /etc/profile
linux
terminal
shell
environment-variables
kjfletch
источник
источник
Ответы:
Конечный двоичный файл наиболее вероятно
setgid
сгруппированutmp
. Setuid и setgid бинарные файлы не установленыLD_LIBRARY_PATH
по соображениям безопасности; увидетьld.so(8)
:источник
В терминале (xterm, aterm и т. Д.) Проверьте, как была вызвана оболочка: оболочка входа в систему покажет «-bash», а не входящая в систему оболочка - «bash» при вызове
echo $0
.Оболочка входа в систему bash будет читать следующее по порядку:
Проверьте, существует ли какой-либо из этих файлов и сбрасывают ли они переменную. Вы также должны следить за любыми файлами, которые эти файлы включают.
Если bash не вызывается как оболочка входа в систему, он все равно будет читать приведенные ниже файлы, если определено, что это интерактивная оболочка.
Простой способ определить тип вызываемой оболочки bash - определить ваши .bash_profile и .bashrc, а также echo "Login shell" и "Interactive shell" соответственно.
Как только вы узнаете, какая оболочка вызывается, у вас есть возможность добавить скрипт в файл .bashrc или .bash_profile в вашем домашнем каталоге. Кроме того, вы можете отключить сброс LD_LIBRARY_PATH.
Обратите внимание, что если ваш .bashrc или .bash_profile защищен защитником, подобным приведенному ниже, вам, возможно, придется вызвать свой сценарий вне его:
Такие охранники, как правило, размещаются для предотвращения многократного получения сценария за сеанс.
Редактировать: Если проверено, что утомительно, чтобы отследить, где переменная сбрасывается, и у вас есть доступ к / etc / profile или /etc/bash.bashrc, например, вы можете временно добавить «set -x» в верхней части скрипт, чтобы увидеть все команды, которые выполняются. Вывод будет довольно многословным, поэтому сначала выполните «set -x» в вашей оболочке и выполните несколько команд, чтобы вы знали, чего ожидать.
источник
set -x
опцию отладки, чтобы получить дамп всего, что делается с момента создания оболочки.set -x
Свалка не имеет никакого отношения к LD_LIBRARY_PATH. Призрак сброшен.bash будет использовать разные сценарии запуска в зависимости от того, как он запускается. Существует семь различных способов его запуска, но наиболее важными являются интерактивные оболочки, не входящие в систему.
Проверьте руководство по bash для более подробной информации. Я подозреваю, что / etc / profile или ~ / .bash_profile что-то делает для сброса переменной LD_LIBRARY_PATH.
Редактировать: Я думаю, что вы сделали все, что могли, чтобы показать, что bash не имеет сценария запуска, который сбрасывает LD_LIBRARY_PATH. Настало время вывести большие пушки.
Следующая команда отобразит всю среду при запуске каждого процесса, от bash до xterm, и все остальное, что может быть задействовано - вы, вероятно, получите большое количество выходных данных, так что сохранение вывода в файл - хорошая идея ,
Теперь файл strace_output.txt будет показывать каждый системный вызов, выполненный вашим сценарием и каждым дочерним процессом, и вы сможете увидеть, какой из процессов был последним с LD_LIBRARY_PATH, прежде чем он был удален.
источник
(Этот вопрос очень старый, но я только что столкнулся с той же проблемой, и я документирую решение для последующих :)
У меня была эта проблема с экраном GNU (мультиплексор терминала), но это может случиться и с обычным терминалом. Тедди был прав в моем случае, экран имеет setguid.
Моим решением было сохранить LD_LIBRARY_PATH перед выполнением, а затем восстановить его. Поэтому я создал оболочку ~ / bin / screen (поместите ~ / bin в PATH) со следующим содержимым:
а затем сделал его исполняемым с
chmod +x ~/bin/screen
. Возможно, вам придется открыть новую оболочку, чтобы она могла забрать обертку.Затем я добавил следующее в ~ / .bashrc. Помните, что ~ / .bashrc получает источник каждый раз, когда вы запускаете bash, в отличие от ~ / .bash_profile, который получает только при входе в систему (обычно при запуске или при входе через ssh).
Теперь screen (или aterm, xterm, ... просто замените его выше) должен сохранить $ LD_LIBRARY_PATH как хотелось бы.
источник
LD_LIBRARY_PATH
в.screenrc
(вместо.bashrc
):setenv LD_LIBRARY_PATH "$PRESERVE_LD_LIBRARY_PATH"
затемunsetenv PRESERVE_LD_LIBRARY_PATH
Кажется, что у вас есть некоторый файл .bashrc (или эквивалентный) в вашем домашнем каталоге, который определяет эту переменную. Я не знаю намного больше деталей, хотя.
Edit Хорошо, так как запуск bash работает, я думаю, не .bashrc. Но может быть какой-то другой файл конфигурации, который выполняется таким же образом, когда вы запускаете xterm или aterm.
источник
Большинство оконных систем воссоздают процесс входа в систему, когда они запускают окно терминала, главным образом потому, что окно терминала становится дочерним элементом диспетчера окон, а не запускающей оболочки.
Итак, поместите его в ваш .bash_profile или .bashrc, если вы хотите, чтобы он появился в новом окне.
Другая альтернатива - передать xterm (например) аргумент для запуска сценария запуска. Не выходите в конце этого сценария ....
источник