Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 30
×

bashrc и profile. Как они выполняются при логине?

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Всем привет.
Поясните тупому, в каком порядка и когда и как эти файлы выполнеяются при логине.
есть bashrc, в нем

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export IPPROOT=/opt/intel/ipp
export CPATH=$IPPROOT/include:$CPATH
arch=intel64
if [ -z "${LD_LIBRARY_PATH}" ]
then
    LD_LIBRARY_PATH="$IPPROOT/lib/$arch"; export LD_LIBRARY_PATH
else
    LD_LIBRARY_PATH="$IPPROOT/lib/$arch:${LD_LIBRARY_PATH}"; export LD_LIBRARY_PATH
fi
if [ -z "${LIBRARY_PATH}" ]
then
    LIBRARY_PATH="$IPPROOT/lib/$arch"; export LIBRARY_PATH
else
    LIBRARY_PATH="$IPPROOT/lib/$arch:${LIBRARY_PATH}"; export LIBRARY_PATH
fi                                                                             
Есть стандартный profile
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
	. "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

После логина в любом терминале с башем есть IPPROOT и пути к этим либам.
Но QtCreator их не видит (точнее не видит CMake при выполнении из QtCreator).

Мне кажется, что я не понимаю логику выполнения этих файлов при загрузке линуха. Поясните.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

какая версия QtCreator и что написано в Project->Build->Build Environment ?

«где мы находимся?
в воздушном шаре!» ©

мне какбы содержимое интересовало

ну добавь их там вручную. нафига их в башэрцэ совать?

если это смаке никуда не будет дистрибутится — наверное
о5 же вопрос — как и откуда запущен криэйтор

ну оттуда он только системные будет подхватывать, потому, что запускается наверняка от спец юзверя
попробуй из тогоже баша запустить

ты креатор запусти из терминала то, а не из хфце

я думал, тебе проблему решить надо, а ты чисто потрындеть. ну ок, в следующий раз пердепеждай, чтобы люди время не тратили

мне казалось проблема вот:

После логина в любом терминале с башем есть IPPROOT и пути к этим либам.
Но QtCreator их не видит (точнее не видит CMake при выполнении из QtCreator).

но тебе виднее. удачи

Виктор, привет.
Все стартап скрипты (если мы говорим о Debian, Red Hat) можно разделить на несколько групп по следующим критериям:

  • Scope:
    • Per system
    • Per user
  • Command (Login/non-Login):
    • login
    • bash

Пойдём по порядку.
Scope: Per system, Command: login, Event: Login — /etc/profile (/etc/profile.d)
Данный скрипт вызывается каждый раз, когда выполняется комманда login (происходит логин в систему)

Scope: Per system, Command: bash, Event: Start — /etc/bash.bashrc
Данный скрпит вызывается когда стартует bash

Scope: Per user, Command: login, Event: Login
Здесь есть некоторые ньюансы.
Выполняется первый скрипт из списка, который найден:
~/.bash_profile
~/.bash_login
~/.profile

Scope: Per user, Command: login, Event: Logout
~/.bash_logout

Scope: Per user, command: bash, Event: Start
~/.bashrc

Как правило из system level (/etc/profile, ~/.profile, etc.) стартап скрипта вызывается стартап скрипт шела. Это сделано, что-бы один раз написать некий стартап скрипт и везде его использовать. Ибо возможны ситуации, когда нужно проинитить рабочее окружение при логине, а бывает что из под GUI при старте шела. Хотя в некоторых случаях получается что он вызывается дважды, например когда сразу после логина запускается bash. Но на это решили забить в угоду удобству.

Можно сделать скрипт для запуска QtCreator, состоящий из одной строчки: комманды env, которая может только для указанной комманды (в твоём случае для QtCreator), задать значение для указанной переменной.
env IPPROOT=VALUE path-to-qt-creator/QtCreator

Ну а затем назвать скрипт QtCreator и подложить в ~/.local/bin

Но вопрос в каком окружении запускается CMake. Если в окружении QtCreator, то он увидит эту переменную, но вот если QtCreator там как-то по хитрому его пускает, то тогда не поможет...

/etc/environment — то слишком мощно (как из пушки по воробьям) и не всем оно нужно...
для конкретной прикладухи можно в /etc/default/ прописать

Тут вот замечательно все расписано: serverfault.com/...​e-bash-profile-and-bashrc

И да — всегда надо помнить о разнице между sub-shell и login shell. Они не идентичны по дефолту.

Б-же, зачем так сложно.

Сделай в cmake переменные (set(IPPROOT "" CACHE STRING "")), а потом -DIPPROOT=xxx и т.д. при вызове цмейка

После логина в любом терминале с башем есть IPPROOT и пути к этим либам.

Т.е. в окружении они есть, а в CMake нет?
Тогда тут определенно дело не в системе.
Для начала запусти CMake из командной строки.
Если проблема не исчезнет — включай verbose mode.

Если из QtCreator, то не видит.

Ух, ты упоротый. Да потому что, ты его запускаешь откуда? Из гуйни? Так вот там нет никаких шелов, оно наследует системные переменные окружения + то, что гуйня напихала — для этого и есть /etc/environment .

А кто-нибудь может сказать, где вообще прочитать про этот зоопарк прописывания переменных в линухе.

help.ubuntu.com/...​nity/EnvironmentVariables

Для твоих целей лучше всего подходит вариант с созданием скрипта в /etc/profile.d/, там сказано, что от туда возьмуться переменные окружения даже DisplayManager’ом — твой случай.

Ну тогда к логину это вобще никакого отношения не имеет и зависит от того, как QtCreator создает внутри себя сессию оболочки. IMHO надо курить настройки самой IDE.
PS Попробуй тот же фокус провернуть с Eclipse или NetBeans.

Я же тебе уже сказал, что общесистемные вещи прописываются в etc/environment . Пропиши и забудь. Ты больше времени строчил на форуме.

Я понял, ты из этих ... садо-мазо, когда есть выбор просто, качественно и быстро, ты выбираешь некое мифическое «правильное», но так чтобы долго и по@баться дня два.

Нет никакого «правильно» для линуха.

и ни в какие bashrc или profile?

Это для шелов, ты можешь запустить свой креатор из шела как:

/opt/Qt/Tools/QtCreator/bin/qtcreator &

тогда он унаследует переменные окружения баша.

Так а .profile для чего. Бессмысленный файл?

Он для всех шелов, ksh, dash, sh, bash, csh и пр.

все зависит от того какой DE запускается

bash(1) раздел INVOCATION.

Но QtCreator их не видит (точнее не видит CMake при выполнении из QtCreator).

QtCreator может не запускать bash вообще. Особенно если Debian/Ubuntu, там /bin/sh -> dash, а не bash.

штука в том, что desktop/session manager сам не является login shell. но он может читать ~/.profile или ~/.xinitrc. разные DM в дополнение читают доп конфигурацию (e.g., ~/.kde/env), может иметь смысл положить конфигурацию туда для конкретного менеджера.

Хороший вопрос, этого там не должно быть. Только bash должна читать .bashrc.

Если там действительно dash, нужно читать Invocation в dash(1). У dash вообще нет эквивалента .bashrc, только .profile и только в режиме login shell. Через QtCreator это будет non-login shell.

Вся та хрень из .bashrc должна быть в ~/.profile, но без if-ов. Потому что оно будет читаться один раз при логине. Потом потом перелогиниться, и все процессы будут видеть те значения.

system-wide переменные окружения в убунте прописываются в /etc/environment, которые будут у всех юзеров.

1. Может быть что QtCreator или CMake запускается под другим юзером?

2. gist.github.com/...​orya/bd0de47f36dbb5c29a90

You put things in ~/.bashrc that would not be inherited by subshells automatically;

Скорее всего CMake запускается в субшеле без .bashrc. Можно попробовать:

— переместить ваши переменные в .profile
— посмотреть возможно в настройках QtCreator можно указать доп. переменные окружения для CMake

Можно, но будут-ли они тогда видны в консолях, что я запускаю (там внутрях bash у меня).

Кто тебе такое сказал, что у тебя баш там? Зиллиард скриптов используют #!/bin/sh , который в убунте dash, а не bash и ложить хотел на bashrc.

А ты сделай полнотекстовый поиск по всему /etc по строке значения, это быстрее чем гадать на кофейной гуще.

Ну и в папке своего профиля то ж самое, может туда чего инсталлятор прописал. Хотя это и проверить недолго: сделай su в другого юзера в консоли, и посмотри чего будет в переменных окружениях.

положи в ~/.my_cool_apprc и сорсь этот файл из ~/.profile и ~/.xinitrc (или соответствующего твоему десктоп менеджеру места с файлами конфигурации)

Підписатись на коментарі