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

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

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

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

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

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

8 ответов

Благодаря этому сообщению я добавил одну строку в ~/.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Вы также можете попробовать, как поделился Seamus Abshere:

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 ФАЙЛЫ.

Просто хочу добавить кое-что о "defshell -bash" (о чем я только что узнал после нескольких месяцев царапин на голове). Когда вы делаете это, дочерняя оболочка, запускаемая экраном, имеет $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 сломает другие вещи, но я заметил, что это скрипт.

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

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

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

Это означает, что при запуске экрана 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\]\$ "

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

Я использую этот фрагмент в моем .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 pasword (так как 99% времени я вхожу в систему для администрирования сервера), и если я планирую выполнить длительную задачу, я отменяю вход в систему sudo, вручную запускаю экран в сеансе моего пользователя и там в sudo.

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

Другие вопросы по тегам