Назад | Перейти на главную страницу

Как заставить экран вести себя как стандартная оболочка bash?

Только что узнал про команду screen в linux - гениально. Я люблю это. Однако фактический терминал / приглашение на экране выглядит и ведет себя иначе, чем мое стандартное приглашение bash. То есть цвета не совпадают, завершение табуляции не работает и т. Д.

Есть ли способ указать экрану вести себя так же, как обычное (по крайней мере, нормальное, как в том, к чему я привык) приглашение bash?

Дополнительная информация

Я подключаюсь через ssh с Mac (терминал) к безголовому Linux-серверу (Ubuntu). После входа в систему у меня TERM=xterm-color и когда я запускаю экран, у меня TERM=screen.

Я собираюсь попробовать следующие предложения, чтобы увидеть, могу ли я изменить $TERM сначала значение.

Благодаря эта почта, я добавил одну строку в ~/.screenrc:

# ~/.screenrc
defshell -bash      # dash makes it a login shell

Тогда вещи в твоем ~/.bashrc, /etc/bashrcи т. д. должны запускаться.

экран меняет тип термина на screen. Вы можете сделать одно из двух:

  1. изменить термин в вашем .screenrc
  2. измените свой .bashrc файлы ищут TERM=screen так же как TERM=xterm

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

Вот мои выводы. Во-первых, мне лично это интересно, и стоит знать разницу между оболочкой входа и оболочкой без входа. Сделать man $SHELL и найдите раздел ПРИЗЫВ, чтобы узнать об этом подробнее.

Вы можете спросить свой текущий экземпляр оболочки, является ли он оболочкой входа или оболочкой без входа, выполнив shopt login_shell по вашему запросу. Обратите внимание, что это обычно параметр только для чтения.

В моих системах Debian screen всегда приходил по умолчанию с оболочками без входа в систему.

После поиска в Интернете и чтения man $SHELL, Я протестировал несколько вещей, и следующие два подхода у меня сработали. В ~/.screenrc добавить / обновить строку следующим образом:

shell -$SHELL

Если это не сработает, И вы используете bash, вы также можете попробовать, как поделился Шеймус:

defshell -bash

Как уже упоминалось, вы можете проверить, является ли ваш текущий экземпляр оболочки оболочкой входа в систему, выполнив shopt login_shell по вашему запросу.

В зависимости от того, как вы привыкли запускать Bash, вы можете использовать оболочку входа в систему. Когда ты бежишь screen, вы используете интерактивную оболочку без входа в систему.

Разница в том, какие сценарии запуска запускаются.

  • /etc/bash.bashrc затем ~/.bashrc поступают при запуске интерактивной оболочки без входа в систему

  • /etc/profile тогда первый найденный ~/.bash_profile, ~/.bash_login, и ~/.profile поступают при запуске интерактивной оболочки входа

Это может влиять на вас.

Я бы также проверил, есть ли $TERM отличается.

screen не заменяет bash, он запускает его или любую другую оболочку. может он работает csh, zsh, или bash но с разными параметрами.

первое, что я бы попробовал, это проверить с ps и /proc/<pid>/cmdline чтобы убедиться, что он использует ту же оболочку с теми же параметрами, что и login делает.

после этого проверьте /etc/screenrc и любой другой файл, упомянутый в man screen Раздел ФАЙЛЫ.

У меня была та же проблема, когда я запускал экран, я потерял интересную подсказку цвета PS1, которую я ловко нашел: P.

Проблема в том, что я запускал это так в ~ / .bash_profile

PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "

Это означает, что когда screen работал с bash_profile, PS1 не переносится.

Исправить легко: добавьте экспорт в оператор PS1 в ~. / Bash_profile, чтобы он выглядел так:

export PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "

Таким образом, при вложенном выполнении переменная не теряется.

Просто хочу добавить кое-что о "defshell -bash" (что я только что понял после месяцев ломания головы). Когда вы это сделаете, дочерняя оболочка, запущенная screen, имеет для $ SHELL значение «bash», а не «/ bin / bash», как обычно. Если вы затем запустите "скрипт" внутри сеанса экрана, вы получите:

$ script
Script started, file is typescript
script: failed to execute bash: No such file or directory

По крайней мере, это то, что происходит на моем компьютере с Ubuntu 14.04. Обходной путь, который я использовал, - запустить $ SHELL=/bin/bash script. Я могу представить, что неправильная установка $ SHELL нарушит другие вещи, но я заметил скрипт.

Я использую этот фрагмент в своем .profile перед запуском любой инициализации оболочки: which screen > /dev/null 2>&1 && { screen -q -ls if [ $? -gt 10 ]; then read -p "$(tput setaf 2)Found a running SCREEN sesion, attach?$(tput sgr0)[Y/n] " y >&2 if [ "${y:-y}" = "y" -o "$y" = "Y" ]; then screen -aDR && logout fi else echo "$(tput setaf 3)No running SCREEN sessions found.$(tput sgr0)" >&2 fi }

Затем, если сеанс экрана не запущен, я ... ну, я не попадаю в стандартное приглашение оболочки. Есть еще одна подсказка для sudo пароль (так как в 99% случаев я вхожу в систему для администрирования сервера), и если я планирую выполнить длительную задачу, я отменяю вход с помощью sudo, запускаю экран вручную в сеансе моего пользователя и sudo там.

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