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