Почему subshell не наследует экспортированную переменную (PS1)?

Я использую startx запустить графическое окружение. У меня очень просто .xinitrc к которому я добавлю вещи при настройке среды, но пока это выглядит следующим образом:

catwm & # Just a basic window manager, for testing.

xterm

Причина, по которой я настраиваю фоновый терминал WM и терминал переднего плана, а не наоборот, как это часто делается, заключается в том, что я хотел бы иметь возможность вернуться к виртуальной текстовой консоли после ввода exit в xterm, Это похоже на работу, как описано.

Проблема в том, что PS1 переменная, которая в настоящее время настроена на мои предпочтения в /etc/profile.d/user.sh (который получен из /etc/profile поставляется дистрибутивом), не распространяется в окружающую среду xterm упомянутое выше. Соответствующее дерево процессов выглядит следующим образом:

\_ -bash
    \_ xinit /home/user/.xinitrc -- /etc/X11/xinit/xserverrc :0 -auth /tmp/serverauth.ggJna3I0vx
        \_ /usr/bin/X -nolisten tcp :0 -auth /tmp/serverauth.ggJna3I0vx vt1
        \_ sh /home/user/.xinitrc
            \_ /home/user/catwm
            \_ xterm
                \_ bash

Оболочка началась xterm кажется интерактивным, оболочка исполняется .xinitrc однако нет. Я согласен с обоими, предположения об интерактивности кажутся совершенно верными, но теперь у меня есть неинтерактивная оболочка, которая косвенно порождает интерактивную оболочку, и у интерактивной оболочки нет шансов автоматически унаследовать подсказку, потому что подсказка не установлена или иным образом сделан недоступным выше по дереву процессов. Как мне вернуть мою подсказку?

1 ответ

Решение

команды env а также export список только переменных, которые экспортируются. $PS1 обычно не экспортируется. Пытаться echo $PS1 в вашей оболочке, чтобы увидеть фактическое значение $PS1,

Неинтерактивные оболочки обычно не имеют $PS1, Неинтерактивный bash явно отменяет $PS1, 1 Вы можете проверить, если bash является интерактивным echo $-, Если вывод содержит i тогда это интерактивно. Вы можете явно запустить интерактивную оболочку, используя опцию в командной строке: bash -i, Shell началась с -c не является интерактивным

/etc/profile Скрипт читается для оболочки входа в систему. Вы можете запустить оболочку как оболочку входа в систему: bash -l,

С bash оболочки сценариев /etc/bash.bashrc а также ~/.bashrc обычно используются для установки $PS1, Эти сценарии создаются при запуске интерактивной оболочки без входа в систему. Это ваш случай в xterm, Смотрите Настройка PS? Струны постоянно

Возможные решения

  • Запустите оболочку внутри xterm в качестве оболочки входа в систему: bash -l, Проверить, если /etc/profile а также ~/.profile не содержат код, который должен быть выполнен только после входа в систему. Возможно, понадобятся небольшие модификации скриптов.
  • Используйте другую оболочку. Например dash не сбрасывается $PS1, Вы можете использовать такую ​​оболочку, как неинтерактивная оболочка, которая будет запускать сценарии до xterm,
  • Откажитесь от строгого соответствия POSIX и используйте стандартное место bash для настройки $PS1: /etc/bash.bashrc или же ~/.bashrc,
  • Откажитесь от строгого соответствия POSIX и создайте собственный скрипт запуска, например: bash --rcfile <(echo "PS1=$PS1save") -i
  • Запустите промежуточные оболочки из startx до xterm как интерактивные оболочки (bash -i). К сожалению, это может иметь некоторые побочные эффекты, и я бы не стал этого делать.
Другие вопросы по тегам