Только что узнал про команду screen на linux - это гениально. Я люблю это. Однако фактический терминал / приглашение на экране выглядит и ведет себя не так, как мое стандартное приглашение bash. То есть цвета не совпадают, завершение табуляции не работает и т. Д.
Есть ли способ, которым я могу сказать, чтобы экран вел себя так же, как нормальная (по крайней мере, нормальная, как в том, к чему я привык) подсказка bash?
Дополнительная информация
Я подключаюсь через ssh от Mac (Терминал) к безголовому linux box (Ubuntu). После входа у меня TERM=xterm-color
и когда я запускаю экран у меня есть TERM=screen
.
Я собираюсь попробовать предложения ниже, чтобы увидеть, смогу ли я $TERM
сначала изменить значение.
bash
gnu-screen
xterm
thornomad
источник
источник
Ответы:
Благодаря этому сообщению я добавил одну строку
~/.screenrc
:Тогда все в ваших
~/.bashrc
,/etc/bashrc
и т.д. , должны получить работать.источник
экран меняет тип термина на
screen
. Вы можете сделать одну из двух вещей:.screenrc
.bashrc
файлы искать,TERM=screen
а такжеTERM=xterm
источник
$HOME/.screenrc
файл и добавил эту строку вверху:term xterm-color
и ва ля! Цвет подсказки и$TERM
значения совпадают. Тем не менее, нет табуляции-завершения ...$TERM
; некоторые вещи включаются с помощью xterm, а также с помощью xterm-color, другие ищут только xterm. У других вещей есть другие выключатели.Мне нравится, как ты написал свой вопрос, я задавал себе то же самое, и потребовалось немного времени, чтобы понять это. Мне повезло, что я уже немного знал о вызове оболочки, поэтому решил, что проблема лежит где-то там.
Вот мои выводы. Во-первых, я лично нахожу это интересным и стоит знать разницу между оболочкой входа в систему и оболочкой без регистрации. Сделайте
man $SHELL
и найдите раздел «ПРИЗНАНИЕ», чтобы узнать больше об этом.Вы можете спросить ваш текущий экземпляр оболочки, является ли он оболочкой входа в систему или не входящей в систему, выполнив
shopt login_shell
запрос на приглашение. Обратите внимание, что обычно это опция только для чтения.В моих системах Debian по
screen
умолчанию всегда использовались не входящие в систему оболочки.После поиска в Интернете и чтения
man $SHELL
я протестировал несколько вещей, и следующие два подхода работали для меня. В~/.screenrc
оном / обновить строку следующим образом :Если это не сработает и вы используете
bash
, вы можете попробовать, как разделяет Seamus :Как уже упоминалось, вы можете проверить, является ли ваш текущий экземпляр оболочки оболочкой входа в систему, выполнив
shopt login_shell
запрос.источник
cd ~/Projects ; screen ; pwd #=> ~/Projects
. Однако то , что я получаю после добавленияshell -$SHELL
к моим~/.screenrc
IScd ~/Projects ; screen ; pwd #=> ~/
В зависимости от того, как вы привыкли запускать 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
разделе ФАЙЛЫ.источник
ps
команду, и она показывает, чтоbash
она работает (это команда ps внутри экрана) ... У меня работает цвет (см. Выше), просто нужно завершить вкладку.У меня была та же проблема, когда я запускал экран, я терял прохладное цветное приглашение PS1, которое я нашел хитро:
Проблема в том, что я запустил это в ~ / .bash_profile
Это означает, что при запуске экрана bash_profile PS1 не переносится.
Исправить несложно: добавьте экспорт в оператор PS1 в ~. / Bash_profile, чтобы он выглядел так:
Таким образом, переменная не теряется во вложенном исполнении.
источник
Просто хочу добавить кое-что о "defshell -bash" (о чем я только что узнал после нескольких месяцев царапин на голове). Когда вы делаете это, дочерняя оболочка, запускаемая экраном, имеет $ SHELL, установленную в «bash» вместо «/ bin / bash», как обычно. Если вы затем запустите «скрипт» внутри сеанса экрана, вы получите:
Или, по крайней мере, так происходит на моей коробке с 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
pasword (так как 99% времени я вхожу в систему для администрирования сервера), и если я планирую выполнить длительную задачу, я отменяю вход в систему sudo, вручную запускаю экран в сеансе моего пользователя и там sudo.Ключевым моментом здесь является «перед любой инициализацией оболочки», так что, когда у вас уже есть сеанс работающего экрана, он уже инициализируется с помощью локали и других вещей, и вам не нужно повторять его снова.
источник