Як я вимагаю, щоб екран поводився як стандартна баш-оболонка?


37

Щойно дізнався про екранну команду на Linux - це геніально. Я це люблю. Однак фактичний термінал / підказка на екрані виглядає і веде себе інакше, ніж мій стандартний баш-рядок. Тобто кольори не однакові, доповнення вкладки, здається, не працює і т.д.

Чи є спосіб, який я можу підказати екрану поводитись так, як звичайний (принаймні, нормальний, як у тому, до чого я звик) баш-підказки?

Додаткова інформація

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

Спробую запропонувати наведені нижче пропозиції, щоб побачити, чи можу я $TERMспочатку змінити значення.


Тільки з цікавості, яка ОС та який тип терміналу у вас під час запуску екрана? Я б припустив, що ваші проблеми мають більше спільного з тим, що ваш Термінал робить щось не так або неправильно виявляє екран.
Зоредаче

@Zoredache - я додав цю інформацію до публікації вище. Спасибі. Мені довелося коригувати настройки мого терміналу, щоб дозволити спрацьовувати клавішу
зворотного простору

Юк, мені дуже не подобається Terminal.app. Особисто я пропоную вам розглянути можливість використання альтернативного дивіться ( serverfault.com/questions/19240/… )
Zoredache

Відповіді:


38

Завдяки цій публікації я додавав один рядок до ~/.screenrc:

# ~/.screenrc
defshell -bash      # dash makes it a login shell

Тоді все в ваших ~/.bashrc, /etc/bashrcі т.д. , повинні отримати працювати.


13

екран змінює тип терміна на screen. Ви можете зробити одну з двох речей:

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

4
Спасибі! Я створив $HOME/.screenrcфайл і додав цей рядок до початку: term xterm-colorі wa la! Колірний рядок і $TERMзначення збігаються. Однак ніяких заповнення вкладки ...
thornomad

Вам потрібно розібратися в тому, що вмикає завершення вкладки. Сценарії конфігурації оболонок за замовчуванням не повністю узгоджуються з тим, на чому вони включені $TERM; деякі речі дозволять використовувати xterm, а також xterm-кольори, інші шукають лише xterm. Інші речі мають інші вимикачі.
статик

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до свого ~/.screenrc,cd ~/Projects ; screen ; pwd #=> ~/
rudolph9,

9

Залежно від того, як ви звикли працювати з Bash, можливо, ви використовуєте оболонку для входу. Під час запуску screenпрацює інтерактивна оболонка без входу.

Різниця полягає в тому, в яких сценаріях запуску запущено.

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

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

Це може вплинути на вас.

Я також перевірив би, чи $TERMне відрізняється.


2

екран не замінює bash, він запускає його чи будь-яку іншу оболонку. може бути , він працює csh, zshабо , bashале з різним paramters.

Перше, що я спробую, це перевірити psі /proc/<pid>/cmdlineпереконатися, що він використовує ту саму оболонку з тими ж параметрами, що loginі.

після цього перевірте /etc/screenrcі будь-який інший файл, згаданий у man screenрозділі ФАЙЛИ.


Я запустив psкоманду, і вона показує, що bashвиконується (це команда ps всередині екрану) ... Я отримав колір, що працює (вгорі) просто потребує завершення вкладки.
терномад

2

У мене була така ж проблема, коли я запустив екран, я втратив круту підказку кольору 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\]\$ "

Як і те, що змінна не втрачається в вкладеному виконанні.


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 }

Потім, якщо не працює сеанс екрана, я ... ну, я не потрапляю у стандартний запит на оболонку. Є ще один sudoпідказ для введення пароля (оскільки 99% часу, коли я входжу в систему, щоб адмініструвати сервер), і якщо я планую виконати тривале завдання, я скасовую вхід в sudo, запускаю екран вручну під час сеансу мого користувача та судо там.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.