Почему 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). К сожалению, это может иметь некоторые побочные эффекты, и я бы не стал этого делать.