Чому мій LD_LIBRARY_PATH отримує невстановлений термінал запуску?


8

У мене є сценарій оболонки, щоб встановити деякі змінні середовища та запустити будь-яку програму, яку я надсилаю як аргумент:

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

Моя 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 

Чи є хтось із таких файлів запуску, які викликають команду "source" або ". команда для введення інших сценаріїв запуску? Якщо так, то один із них може бути винуватцем.
Кевін Панько

Не відповідає на ваше запитання, але дійсно гарною річчю було б позбутися потреби LD_LIBRARY_PATH (причини: 1 2 3 ). Ви можете, наприклад, відредагувати /etc/ld.so.conf або скласти будь-які визначені користувачем libs у ~ / local таким чином, щоб вони знали, де знайти свої бібліотеки (див. Посилання, які я надав).
DevSolar

Відповіді:


9

Термінальний двійковий, швидше за все, setgidгрупується utmp. Встановлені та встановлені жорсткі бінарні файли, відключені LD_LIBRARY_PATHз міркувань безпеки; див . ld.so(8):

Необхідні спільні бібліотеки, необхідні програмі, шукаються в наступному порядку

  • Використання змінної середовища LD_LIBRARY_PATH( LD_AOUT_LIBRARY_PATHдля програм a.out). За винятком випадків, коли виконуваний файл є бінарним файлом setuid / setgid, в цьому випадку він ігнорується.

4

У терміналі (xterm, aterm тощо) перевірте, як викликалася оболонка: оболонка для входу покаже "-bash", а оболонка без входу покаже "bash" під час дзвінка echo $0.

$ echo $0
-bash
$ bash
$ echo $0
bash

Оболонка bash для входу буде читати наступне в порядку:

  1. / тощо / профіль
  2. ~ / .bash_profile
  3. ~ / .bash_login
  4. ~ / .профіль

Перевірте, чи існує якийсь із цих файлів, і чи вони скинули змінну. Вам також доведеться дотримуватися файлів, до яких належать ці файли.

Якщо bash не викликається як оболонка для входу, він все одно буде читати файли нижче, якщо визначено, що це інтерактивна оболонка.

  1. /etc/bash.bashrc
  2. ~ / .bashrc

Простий спосіб визначити тип оболонки bash - це визначити ваші .bash_profile та .bashrc, а також відповідати відповідним чином "shell shell" та "Interactive shell".

Як тільки ви дізнаєтесь, який тип оболонки викликається, у вас є можливість додати свій скрипт до файлу .bashrc або .bash_profile у вашому домашньому каталозі. Крім того, ви можете відключити скидання LD_LIBRARY_PATH.

Зауважте, що якщо ваш .bashrc або .bash_profile захищений захистом, подібним до наведеного нижче, вам, можливо, доведеться зателефонувати за своїм сценарієм поза ним:

if [ "X$BASH_SOURCED" != "XYES" ]; then
        export BASH_SOURCED=YES

fi

Такі охоронці зазвичай розміщуються, щоб запобігти створенню сценарію кілька разів під час сеансу.

Редагувати: Якщо теді доводить відслідковувати, де змінюється змінна, і у вас є доступ до / etc / profile або /etc/bash.bashrc, наприклад, ви можете тимчасово додати "set -x" біля верхньої частини скрипт, щоб побачити всі команди, які виконуються. Вихід буде досить багатослівним, тому спочатку зробіть "set -x" у своїй оболонці та запустіть кілька команд, щоб ви знали, що чекати.


+1 Дякую за інформацію. Я оновив свою ОП у відповідь на вашу відповідь.
kjfletch

Чи бачите ви таку саму поведінку, якщо ви вводите нову оболонку bash на тому ж терміналі, ввівши bash? До речі, вам також знадобиться перевірити файли, які викликаються з /etc/bash.bashrc та / etc / profile - один із них може змінити зміну. Крім того, використовуйте параметр set -xналагодження, щоб отримати дамп всього, що робиться з моменту створення оболонки.

set -xЗвалище не має ніякого відношення до LD_LIBRARY_PATH. Привид відключений.
kjfletch

4

bash використовуватиме різні сценарії запуску залежно від способу запуску. Існує сім різних способів її запуску, але найважливішими є вхідні оболонки проти інтерактивних оболонок без входу.

Перегляньте посібник з bash для отримання більш детальної інформації. Я б підозрював, що / etc / profile або ~ / .bash_profile щось робить для скидання змінної LD_LIBRARY_PATH.


Редагувати: Я думаю, що ви зробили все, що можете, щоб показати, що у bash немає жодного сценарію запуску, який би скасовував LD_LIBRARY_PATH. Настав час вивести великі гармати.

Наступна команда відображатиме все середовище під час запуску кожного процесу, від bash до xterm, і будь-що інше, що трапляється, - ви, ймовірно, отримаєте велику кількість результатів, тому збереження виводу у файл - хороша ідея .

strace -v -f -e trace=process -o strace_output.txt envrun.sh xterm

Тепер у файлі strace_output.txt буде показано кожен системний виклик, зроблений за вашим сценарієм, і кожен дочірній процес, і ви зможете побачити, який процес був останнім у LD_LIBRARY_PATH перед його видаленням.


2

(Це запитання дуже старе, але я просто зіткнувся з тією ж проблемою, і я документую рішення задля задля :)

У мене були проблеми з екраном GNU (термінальним мультиплексором), але це може статися і зі звичайним терміналом. Тедді мав рацію в моєму випадку, екран встановив регулятор.

$ ls -l /usr/bin/screen
-rwxr-sr-x 1 root 84 361016 Mar 30  2011 /usr/bin/screen
      ^

Моє рішення полягало в тому, щоб зберегти LD_LIBRARY_PATH перед виконанням та відновити його після цього. Тому я створив обгортку ~ / bin / screen (поставити ~ / bin на PATH) із таким вмістом:

#!/bin/bash

# somehow, screen resets LD_LIBRARY_PATH.
# save it here, and restore it in .bashrc
export PRESERVE_LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
/usr/bin/screen "$@"

а потім зробив його виконуваним за допомогою chmod +x ~/bin/screen. Можливо, вам доведеться відкрити нову оболонку, щоб забрати обгортку.

Потім я додав до ~ / .bashrc. Пам'ятайте, що ~ / .bashrc отримує джерело кожного разу при запуску bash, на відміну від ~ / .bash_profile, який отримується лише під час входу (як правило, при запуску або під час входу через ssh).

if [[ "$PRESERVE_LD_LIBRARY_PATH" != "" ]]; then
    export LD_LIBRARY_PATH="$PRESERVE_LD_LIBRARY_PATH"
    #echo "restored LD_LIBRARY_PATH"
    export -n PRESERVE_LD_LIBRARY_PATH
fi

Тепер екран (або aterm, xterm, ... просто замініть його вище) повинен зберігати $ LD_LIBRARY_PATH так, як хотілося.


Ви також можете відновити LD_LIBRARY_PATHв .screenrc(замість .bashrc): setenv LD_LIBRARY_PATH "$PRESERVE_LD_LIBRARY_PATH"даліunsetenv PRESERVE_LD_LIBRARY_PATH
nandhp

0

Схоже, у вашому домашньому каталозі є якийсь .bashrc (або еквівалентний) файл, який визначає цю змінну. Однак я не знаю набагато більше деталей.

Редагувати Добре, оскільки починаю роботу з bash, я здогадуюсь не .bashrc. Але, можливо, якийсь інший файл конфігурації, який, можливо, виконується так само, коли ви запускаєте xterm або aterm.


Це була моя оригінальна думка. Після довгих пошуків нічого знайти не вдалося. Я маю перевагу мати дуже чистий (НОВИЙ) $ ДОМАШНЯ.
kjfletch

0

Більшість віконних систем відтворюють процес входу під час запуску вікна терміналу, в першу чергу через те, що вікно терміналу стає дочіркою менеджера вікон, а не оболонкою запуску.

Отже, помістіть його у свій .bash_profile або .bashrc, якщо ви хочете, щоб він відображався у новому вікні.

Інша альтернатива - передавати xterm (наприклад) аргумент для запуску сценарію запуску. Не виходьте в кінці цього сценарію ....


Мені доведеться вдатися до цього, думаю. Я, мабуть, буду джерелами змінних оточуючих у обох .xinitrc, тому мій менеджер вікон має їх, і в .bashrc, щоб мої термінальні вікна їх мали.
kjfletch
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.