Только что узнал про команду 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
. Вы можете сделать одно из двух:
.screenrc
.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 там.
Ключевым моментом здесь является «перед любой инициализацией оболочки», так что, когда у вас уже есть запущенный сеанс экрана, он уже инициализирован с использованием локали и других вещей, и вам не нужно повторять его снова.