Консультация № 173614
23.10.2009, 21:08
25.00 руб.
0 7 2
Здравствуйте, уважаемые эксперты!
Хотел бы услышать подробный и понятный ответ на вопрос, что такое переменные окружения в Linux (оболочка bash), как их изменять и т.д. В сети посмотрел, там как-то все не то. Возможно, вопрос станет конкретнее, если я поясню зачем именно мне они нужны. Допустим, есть компилятор lf95 для фортрана, его надо поставить, а для этого, как мне говорили спецы, нужно сначала что-то прописать в переменных окружения...Заранее спасибо!

Обсуждение

Неизвестный
23.10.2009, 22:40
общий
это ответ
Здравствуйте, Gerhard.

Переменные окружения - это основное средство для хранения различных настроек, задаваемых и системой и пользвателем. По форме - это обычные переменные, которые задаются как и в любой другой программе, по сути - некие "мини-хранилища" данных, которые Вы потом можете использовать во всех скриптах и программах, написанных на любом языке. Переменная окружения инициализируется в момент запуска процесса оболочки /bin/bash (в Вашей системе пуь может отличаться) из файла ~.bashrc (или ~.shrc) и существует в течение всего времени, пока данная копия оболочки не завершит работу. Выделенный момент очень важен - если Вы создаете переменную окружения, а потом закрываете оболочку, переменная исчезает. Ее также можно задать вручную непосредственно в самом скрипте. Любая программа, запущенная в данной копии оболочки, может получить доступ к переменным окружения, существовавшим в тот момент, когда данная программа была запущена. Основное назначение переменных окружения - передавать некоторую информацию в те программы, которые будут в данной оболочке впоследствие запускаться.

Имя переменной окружения выбирается произвольно, оно может состоять из символов латиницы и знака подчеркивания. Общепринято в тексте программ, скриптов и документации писать имена переменных окружения БОЛЬШИМИ буквами, при этом как такового ограничения на длину нет, например: PKG_CONFIG_DISABLE_UNINSTALLED. Значение переменной окружения задается в текстовом виде, Вы не можете передавать двоичные значения. Как такового ограничения или какого-либо форматирования не предусмотрено - все, что будет указано после знака равенства - все будет установлено в качестве значения и передано в запросившую программу, например:
PKG_CONFIG_PATH=/usr/X11R6/libdata/pkgconfig:/usr/X11R6/qt33/libdata/pkgconfig:/usr/local/kde3/libdata/pkgconfig

Разбор значения переменной окружения - прерогатива программиста. Наиболее известное применение переменной окружения - это получение информации о том, где оболочка может искать запускаемый файл. Если Вы вводите просто имя файла команды, не предваряя его полным путем, то оболочка обращается к заранее оговоренной переменной окружения (как правило это переменная PATH), в которой заранее перечислены все пути, где данная команда может находиться. Если ни в одном из этих мест команда не была найдена, Вы увидите сообщение о том, что команда не найдена. Скорее всего именно путь к каталогу, где будет установлен Ваш компилятор - и нужно прописать в переменную PATH. Все переменные окружения, используемые самой оболочкой, как правило перечислены в мануале, их достаточно много, некоторые используются очень часто, некоторые крайне редко.

Для того, чтобы переменная окружения не исчезала при завершении работы командной оболочки, ее можно "экспортировать", то есть с помощью специальной команды (в /bin/bash это export) передать в оболочку более высокого уровня (ту, что запустила работающую в данный момент оболочку). Как правило, все переменные окружения, задаваемые в .bashrc экспортируются, потому что иначе они исчезнут сразу же после того, как оболочка дочитает (а по сути - закончит выполнять) файл .bashrc

Что прописывать и где прописывать. Как правило, что прописывать и в каком формате это "что" должно быть - указывается в документации к программе. Если документации нет, а достоверно известно, что переменные окружения используются - можно посмотреть код программы, если он доступен, на предмет наличия вызовов функции типа getenv() . Прописывается же переменная окружения или непосредственно в скрипте перед запуском программы, например при запуске с помощью команды env, если таковая имеется в Вашей системе - env TESTVAR=testvalue /usr/bin/myprogram. В результате программа myprogram при запуске получит окружение, в которое будет вставлена переменная TESTVAR со значением testvalue. Можно также создать небольшой скриптик, состоящий только из строк задания переменной окружения и запуска программы. Такие способы очень хороши для отладки, когда требуется придавать различным переменным окружения разнообразные произвольные значения. Для постоянного задания переменной окружения ее следует включить в файл, который читается при запуске оболочки (.bashrc для /bin/bash, при его отсутствии может читаться .shrc и/или .profile, подробности уточняйте в руководстве по оболочке) и обязательно экспортировать ее.

5
Спасибо за столь подробное описание!
Неизвестный
23.10.2009, 22:55
общий
это ответ
Здравствуйте, Gerhard.
Переменный окружения в linux то же самое, что и переменные окружения в DOS или Windows. Набор сопоставленных пар ключ - значение.
В общем случае для запуска программы с измененным окружением используется команда env. Вызывается следующим образом:
env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]
опции:
-i, --ignore-environment
Запуск с пустым окружением (в окружении будут только явно объявленные переменные
-u, --unset=NAME
Удалить переменную окружения с указанным именем
Указание первым аргументом дефиса "-" дает тот же эффект, что и опция -i
Далее следуют пары опция=значение, первый аргумент, не содержащий "=" используется как имя программы, следующие за ним аргументы становятся аргументами программы.
Так как в вашем частном случае используется оболочка bash, то можно воспользоваться ее встроенными возможностями:
$ NAME=VALUE NAME=VALUE .... COMMAND [ARG]
То есть просто указываем новые значения переменных перед именем вызываемой программы.
Для того чтобы установить переменные один раз и не указывать при последующих вызовах их значения повторно, можно воспользоваться встроенной командой bash export:
$ export NAME=VALUE ...
после этого указанные значения переменных окружения будут действительны для всех последующих команд, выполненных в данном экземпляре bash.
Если вы хотите установить новые значения переменных окружения и для последующих запусков bash, добавьте их объявления в конец файла .bashrc, находящегося в вашем домашнем каталоге (в случае отсутствия создайте).
Если вы хотите установить новые значения переменных окружения глобально для всех пользователей, то следует отредактировать файл /etc/environment
Конкретно для lf95 процедура установки предполагает как альтернативу установке LD_LIBRARY_PATH настройку загрузчика через редактирование /etc/ld.so.conf
Например если у вас будет установлена версия 6.2, то исполняемые файлы будут лежать в каталоге /usr/local/lf9562/bin , библиотеки в /usr/local/lf9562/lib и для запуска потребуется добавить к PATH первый каталог и установить LD_LIBRARY_PATH=/usr/local/lf9562/lib , то есть запускать так
$ PATH=$PATH:/usr/local/lf9562/bin LD_LIBRARY_PATH=/usr/local/lf9562/lib lf95 file.f90
либо добавить строки
PATH=$PATH:/usr/local/lf9562/bin
LD_LIBRARY_PATH=/usr/local/lf9562/lib
в конец файла .bashrc в домашнем каталоге
либо добавить ":/usr/local/lf9562/bin" в конец соответствующей строки в /etc/environment , добавить строку /usr/local/lf9562/lib в /etc/ld.so.conf и однократно запустить ldconfig. После этого запуск для всех пользователей будет выглядеть так
lf95 file.f90
5
Ваш ответ мне особенно понравился тем, что приведены конкретные примеры для lf95. Есть пара доп. вопросов - см. минифорум
Неизвестный
24.10.2009, 10:51
общий
Снова всем добрый день!
Допустим я добавлю строки
PATH=$PATH:/usr/local/lf9562/bin
LD_LIBRARY_PATH=/usr/local/lf9562/lib
в файл bashsrc, но как lf95 догадается, что это (в частности PATH) переменная именно для него и будут ли, если их прописать в bashsrc, переменные экспортированы?
Кстати, почему у PATH в начале стоит $PATH, а у LD_LIBRARY_PATH нет?
Неизвестный
24.10.2009, 18:13
общий
Gerhard:
Через ":" идет перечисление путей.
Когда присваивается значение для переменной, то она пишется без $ в начале, а когда Вы ее употребляете, то с $. Например:
a=5
echo $a
Переменная PATH универсальная, она для всего, что у Вас запускается и работает. Такие переменные для удобства обозначают большими буквами. И их присвоение прописано в стартовых скриптах. А когда что-то новое запускается, оно проверяет, установлена ли нужная ему переменная и сообщает Вам, если что-то не так.
Неизвестный
24.10.2009, 20:54
общий
lupus campestris:
Спасибо, вроде понял. Еще один вопросик - эксперт vladisslav написал, что запускать надо как lf95 file.f90...А если у программы на фортране (для которой компилятор) есть makefile и в нем в опции FC прописать просто FC=lf95 и потом запустить make будет ли этого достаточно?
Неизвестный
24.10.2009, 21:00
общий
Gerhard:
С фортраном не сталкивалась, поэтому не смогу ответить, к сожалению.
Неизвестный
24.10.2009, 22:40
общий
Gerhard:
Если есть makefile, то он будет работать по общим правилам преобразования, которые там написаны или же по общим правилам преобразовния для суффикса f90. В любом случае нужно видеть текст makefile, чтобы ответить на вопрос, достаточно будет или нет

По поводу записи вида VAR=$VAR:bla:blabla:blablabla. Такая запись используется при дополнении текущего значения переменной и означает "взять текущее значение переменной VAR и дописать к ней всю остальную строку"

По поводу PATH и других переменных. Есть переменные, использование которых является как бы стандартом, PATH одна из них. Все программы рассчитывают на то, что в окружении установлена переменная PATH, в которой задается список каталогов, где искать исполняемые программы. Если переменная не установлена, то программа может ничего не сказать, а просто принять значения по умолчанию.
Форма ответа