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