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


37

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

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

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

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

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


Просто из любопытства, какая ОС и какой тип терминала у вас при запуске экрана? Я полагаю, что ваши проблемы больше связаны с тем, что ваш терминал делает что-то неправильно или неправильно идентифицирует экран.
Зоредаче

@Zoredache - я добавил эту информацию в пост выше. Спасибо. Я действительно должен был настроить параметры моего терминала, чтобы позволить клавише
Backspace

Я действительно не люблю Terminal.app. Лично я предлагаю вам рассмотреть возможность использования альтернативного см. ( Serverfault.com/questions/19240/… )
Zoredache

Ответы:



13

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

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

4
Благодарность! Я создал $HOME/.screenrcфайл и добавил эту строку вверху: term xterm-colorи ва ля! Цвет подсказки и $TERMзначения совпадают. Тем не менее, нет табуляции-завершения ...
Торномад

Вам нужно покопаться в том, что включает завершение табуляции. Сценарии конфигурации оболочки по умолчанию не полностью согласуются с тем, что они включают на основе $TERM; некоторые вещи включаются с помощью xterm, а также с помощью xterm-color, другие ищут только xterm. У других вещей есть другие выключатели.
staticsan

11

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

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

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

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

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

shell -$SHELL

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

defshell -bash

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


Есть ли способ запустить оболочку в текущем каталоге? Пример того, чего я желаю, это следующее cd ~/Projects ; screen ; pwd #=> ~/Projects. Однако то , что я получаю после добавления shell -$SHELLк моим ~/.screenrcIScd ~/Projects ; screen ; pwd #=> ~/
rudolph9

9

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

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

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

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

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

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


2

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

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

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


Я запустил psкоманду, и она показывает, что bashона работает (это команда ps внутри экрана) ... У меня работает цвет (см. Выше), просто нужно завершить вкладку.
Торномад

2

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

Проблема в том, что я запустил это в ~ / .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\]\$ "

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


1

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


0

Я использую этот фрагмент в моем .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 }

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.