LINUX.ORG.RU

Как правильно организовать работу со стартовыми скриптами в терминале/ДЕ?

 , , ,


0

3

Есть у меня такая конфигурация: .bashrc и .profile (как я понимаю, он подтягивается, если нет .bash_profile и при этом более универсальный).

.profile загружает .bashrc и больше ничего важного не делает.

В .bashrc есть разные персональные настройки (алиасы, PS1 и т.п.) и есть секция переменных и алиасов для поддержки XDG directories в приложениях, которые этого не умеют сами - вот эта секция меня интересует. Она должна выполняться в любом окружении - tty, эмулятор консоли, ДЕ, запускаемые из ДЕ команды, запускаемые из крона команды.

Я читал, что .profile грузится только для логин-шелла, то есть, в tty после логина будет и загруженный .bashrc. А в графических терминалах загружается только .bashrc. То есть, такой сетап, как у меня, должен работать так, как мне надо. Но он не работает или я не понимаю, как он должен работать.

Я делаю так: логинюсь в tty, проверяю, что XDG переменные подгрузились, запускаю из этой консоли startxfce4, открывается DE. Запускаю по шорткату urxvt, вижу белый дефолтный терминал. Вызов xrdb с нужным Xresources есть в той же секции XDG. В tty он очевидно не сработал, после запуска urxvt он тоже эффекта не произведёт, потому что терминал уже запущен. Следующий терминал уже открывается чёрный и красивый, потому что в предыдущем вызвался .bashrc с нужными настройками. Получается, что команды, выполняемые по горячим клавишам, не используют .profile и .bashrc?

Как правильно организовать эти скрипты, чтобы нужный набор переменных был доступен везде? И желательно, чтобы после изменения этих настроек и tty, и команды по горячим клавишам, и urxvt динамически запускались с обновленными настройками, без рестарта DE/сессии. Пока я вынес эти переменные в отдельный файл и включаю его в оба скрипта через source и в некоторых командах в xfce4-keyboard-settings и кронтабе принудительно, но мне кажется, это как-то неестественно.

Может, кто-то организует стартовые скрипты удобнее?

★★★

Она должна выполняться в любом окружении - tty, эмулятор консоли, ДЕ, запускаемые из ДЕ команды, запускаемые из крона команды.

Если и в DE нужно, то через systemd решается задача.

ns_ramesses
()

Из мануала systemd-system.conf:

       DefaultEnvironment=
           Sets manager environment variables passed to all executed processes.
           Takes a space-separated list of variable assignments. See environ(7)
           for details about environment variables.

           Example:

               DefaultEnvironment="VAR1=word1 word2" VAR2=word3 "VAR3=word 5 6"

ns_ramesses
()
Ответ на: комментарий от sudopacman

А еще можно в ~/.xprofile прописать:

...
xrdb -merge /etc/X11/Xresources
xrdb -merge ${HOME}/.Xresources
...
urxvtd --fork --opendisplay --quiet
...

ns_ramesses
()
Ответ на: комментарий от sudopacman

Добавляй xrdb в .profile.

Не надо так делать. .profile должен читаться при любом входе, не только графическом.

xrdb и ему подобные уместно вызывать из .xsession

Заодно туда же [в .profile] можешь добавить строчки для автозапуска иксов.

Лютейший бред.

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

Zmicier ★★★★★
()

.xinitrc - xrdb и прочая шняга
в .profile - то, что единожды при логине - обычно это переменные
.bashrc - всякие алиасы, функции и прочая шняга

mystery ★★
()

Я читал, что .profile грузится только для логин-шелла, то есть

Да, причем в зависимости от поставки операционной системы и экранного диспетчера, графическая оболочка или является входной или нет.

Причем KDM в Дебиане, например, еще и .bash_profile / .zprofile читает, если у пользователя соответствующая оболочка выбрана за входную.

Бардак, короче.

в tty после логина будет и загруженный .bashrc.

Если он вызывается из .profile, то да.

А в графических терминалах загружается только .bashrc.

???

.bashrc загружается только при запуске ГНУ Баша интерактивно, причем при каждом, кроме как при входе. При чем здесь графические сессии?

Zmicier ★★★★★
()
Ответ на: комментарий от mystery

.xinitrc

Читается ли оно большинством экранных диспетчеров? По-моему, это в большей степени для случая, когда вы уже вошли, а только потом пускаете startx.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от Zmicier

Лютейший бред.

Почему? Я так делал на своём десктопе, всё норм. Ну, там идёт проверка по номеру tty, так что иксы будут стартовать только там, где надо.

sudopacman ★★★★★
()
Ответ на: комментарий от Zmicier

Кстати да, про то, что xrdb можно запихнуть в автозапуск DE, я совсем забыл

sudopacman ★★★★★
()
Ответ на: комментарий от Zmicier

xrdb и ему подобные уместно вызывать из .xsession

~/.xsession разве не deprecated? Есть же ~/.xprofile, а также ~/.xinitrc.

При этом DM'ы подгружают сначала ~/.xprofile, потом - ~/.xinitrc, а startx - только ~/.xinitrc.

ns_ramesses
()
Последнее исправление: ns_ramesses (всего исправлений: 1)

есть секция переменных и алиасов для поддержки XDG directories в приложениях, которые этого не умеют сами - вот эта секция меня интересует. Она должна выполняться в любом окружении - tty, эмулятор консоли, ДЕ, запускаемые из ДЕ команды, запускаемые из крона команды.

Переменные — понятно, они должны быть в ~/.profile, если экранный диспетчер его по какой-то причине не читает, надо сделать, чтоб читал.

«Алиасы» — это что? Те, что, например, в Баше alias ll='ls -lhF'? Так они не наследуются, и не должны.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от ns_ramesses

~/.xsession разве не deprecated?

Не знаю, у меня работает, где об этом почитать? Но вообще это было бы странно, ибо пансистемный Xsession, очевидно, никуда не делся.

Zmicier ★★★★★
()
Ответ на: комментарий от sudopacman

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

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

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от mystery

Если это startx или slim - то да, иначе - xdg autostart

Автозапуски — совсем для другого, они исполняются (exec), а не читаются (source), то есть, к примеру, переменные оттуда экспортировать бессмысленно.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

хз, я делаю export VAL=KEY и этот key работает во всех приложениях

mystery ★★
()
Ответ на: комментарий от mystery

в .profile - то, что единожды при логине - обычно это переменные

А если не единожды, а понадобится кое-какие переменные обновить для текущей сессии, то это можно сделать, только перезапустив DE?

E ★★★
() автор топика
Ответ на: комментарий от Zmicier

При чем здесь графические сессии?

В эмуляторе терминала запускается non-login interactive shell, он подгружает только bashrc без profile, или я что-то упустил?

E ★★★
() автор топика

Чот перечитал и сам не понял, что вчера писал.

Такой юз-кейс, например:

Есть mocp, он non-XDG-compliant, но его можно заставить хранить конфиг где нужно через опцию. Т.е. запускать либо через алиас, либо через скрипт-обёртку. Мне нужно, чтобы этот алиас/скрипт запускался вместо оригинального mocp:

  • в TTY (ctrl+alt+f1);
  • после запуска иксов и DE автоматически при старте;
  • после запуска иксов и DE через startx/startxfce;
  • в urxvt, запускаемом внутри этого DE;
  • в xfce через горячие клавиши (например, mocp -G для паузы);
  • в crontab (будильник на нём работает);
  • наверное, можно ещё какой-нибудь косвенный запуск придумать, типа system().

При этом обязательно, чтобы только для моего юзера, т.е. системный profile не изменялся; и очень желательно, чтобы если вдруг я решу снова исправить этот алиас/скрипт, изменения прозрачно были видны для всех случаев выше без перезапуска DE (в шелле хотя бы можно сделать source .profile).

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

Пока, судя по треду, малой кровью не обойтись? В сустемд лезть очень не хочется.

E ★★★
() автор топика
Последнее исправление: E (всего исправлений: 2)
Ответ на: комментарий от E

в .profile - то, что единожды при логине - обычно это переменные

А если не единожды, а понадобится кое-какие переменные обновить для текущей сессии, то это можно сделать, только перезапустив DE?

Что такое «перезапуск DE»? Если он подразумевает выход / вход заново, то вы сами себе и ответили.

Zmicier ★★★★★
()
Ответ на: комментарий от E

При чем здесь графические сессии?

В эмуляторе терминала запускается non-login interactive shell, он подгружает только bashrc без profile, или я что-то упустил?

Да, если эта невходная интерактивная оболочка — ГНУ Баш. В противном случае — какой-то другой *rc.

Zmicier ★★★★★
()
Ответ на: комментарий от E

Т. е. запускать либо через алиас, либо через скрипт-обёртку. Мне нужно, чтобы этот алиас/скрипт запускался вместо оригинального mocp:

«Алиасы» — это, как я уже сказал, функционал интерактивных оболочек, они не наследуются и для описанного вами не предназначены.

Второй вариант — сценарий-обертка — решение совершенно верное, положить его в ~/.bin/ и убедиться, что $HOME/.bin/ присутствует в $PATH.

Для этого пишете в ~/.profile (а точнее даже — убеждаетесь, что у вас там еще нет):

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

и проверяете — если все подхватилось, то вам повезло. Если нет, то сообщаете, что у вас за операционная система, поставка и экранный диспетчер.

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

в crontab (будильник на нём работает);

Нет, туда ваш $PATH не попадет. Смиритесь.

в шелле хотя бы можно сделать source .profile

Нет, так делать нельзя. .profile выполняется только раз при входе и вполне имеет право содержать инструкции, повторное применение которых ведет к сбою.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 2)
Ответ на: комментарий от Zmicier

Нет, туда ваш $PATH не попадет. Смиритесь.

Уже попадает. Смирился.

man crontab

E ★★★
() автор топика

Сделал отдельный скрипт xdg с переменными, который можно соурсить в .profile или .bashrc, а можно запускать с аргументами, тогда он будет подставлять корректное окружение для команд, типа xdg mocp --info

Пока что лучшее решение, минус в том, что приходится писать case внутри скрипта для всех таких команд, плюс в том, что можно обернуть вызовы команд и в кроне, и в настройках DE и даже system().

E ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.