3

Я использую 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 ответ1

3

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

Неинтерактивные оболочки обычно не имеют $PS1 . Неинтерактивный bash явно сбрасывает $PS1 . 1 Вы можете проверить, является ли bash интерактивным с помощью echo $- . Если вывод содержит i то он является интерактивным. Вы можете явно запустить интерактивную оболочку, используя опцию в командной строке: bash -i . Оболочка, запущенная с -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). К сожалению, это может иметь некоторые побочные эффекты, и я бы не стал этого делать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .