Jak poprosić screen, aby zachowywał się jak standardowa powłoka bash?

37

Właśnie poznałem komendę screen na Linuksie - jest genialna. Kocham to. Jednak rzeczywisty monit / terminal na ekranie wygląda i zachowuje się inaczej niż mój standardowy monit bash. Oznacza to, że kolory nie są takie same, uzupełnianie tabulatorów nie działa itp.

Czy istnieje sposób, w jaki mogę powiedzieć ekranowi, aby zachowywał się tak jak normalny (przynajmniej normalny jak w tym, do czego jestem przyzwyczajony) monit bash?

Dodatkowe informacje

Łączę się przez ssh z komputera Mac (terminal) z bezgłowym systemem Linux (Ubuntu). Po zalogowaniu mam, TERM=xterm-colora kiedy uruchamiam ekran, mam TERM=screen.

Wypróbuję poniższe sugestie, aby sprawdzić, czy mogę $TERMnajpierw zmienić wartość.

thornomad
źródło
Właśnie z ciekawości jaki system operacyjny i jaki terminal masz na ekranie startowym? Sądzę, że twoje problemy mają więcej wspólnego z tym, że twój terminal robi coś złego lub źle identyfikuje się na ekranie.
Zoredache
@Zoredache - powyżej dodałem tę informację do wpisu. Dzięki. Musiałem dostosować ustawienia terminala, aby klawisz Backspace działał ...
Thornomad
Fuj, naprawdę nie lubię Terminal.app. Osobiście sugeruję, aby rozważyć użycie alternatywnego patrz ( serverfault.com/questions/19240/… )
Zoredache

Odpowiedzi:

38

Dzięki temu postowi dodałem jedną linię do ~/.screenrc:

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

Wtedy rzeczy w swoim ~/.bashrc, /etc/bashrcitp powinno się uruchomić.

Seamus Abshere
źródło
13

ekran zmienia typ terminu na screen. Możesz zrobić jedną z dwóch rzeczy:

  1. zmień ustawienie terminu w swoim .screenrc
  2. zmodyfikuj .bashrcwygląd plików, TERM=screena takżeTERM=xterm
staticsan
źródło
4
Dzięki! Utworzyłem $HOME/.screenrcplik i dodałem ten wiersz na górę: term xterm-colori wa la! Kolor zachęty i $TERMwartości są zgodne. Jednak brak tabulacji ...
thornomad
Musisz zagłębić się w to, co włącza uzupełnianie tabulacji. Domyślne skrypty konfiguracyjne powłoki nie są całkowicie spójne pod względem tego, co umożliwiają na podstawie $TERM; niektóre rzeczy umożliwią zarówno xterm, jak i xterm-color, inne szukają tylko xterm. Inne rzeczy mają inne przełączniki.
staticsan
11

Podoba mi się sposób, w jaki napisałeś swoje pytanie, zadałem sobie to samo i zajęło mi to trochę czasu, aby je zrozumieć. Miałem szczęście wiedzieć już trochę o wywołaniu powłoki, więc pomyślałem, że gdzieś tam leży problem.

Oto moje ustalenia. Po pierwsze, osobiście uważam to za interesujące i warte poznania różnicy między powłoką logowania a powłoką niezalogowaną. Wykonaj a man $SHELLi wyszukaj sekcję ZAPROSZENIE, aby przeczytać więcej na ten temat.

Możesz zapytać bieżącą instancję powłoki, czy jest to powłoka logowania lub powłoka niezalogowana, wydając shopt login_shellpolecenie w wierszu polecenia. Uwaga: zazwyczaj jest to opcja tylko do odczytu.

W moich systemach Debian screenzawsze pojawiały się domyślne powłoki niezalogowane.

Po przeszukaniu sieci i przeczytaniu man $SHELLprzetestowałem kilka rzeczy i działały dla mnie następujące dwa podejścia. W ~/.screenrcDodaj / zaktualizuj linię w następujący sposób:

shell -$SHELL

Jeśli to nie zadziała ORAZ używasz bash, możesz alternatywnie spróbować, jak udostępnił Seamus :

defshell -bash

Jak wspomniano, możesz sprawdzić, czy bieżąca instancja powłoki jest powłoką logowania, wydając shopt login_shellpolecenie.

Kyle
źródło
Czy jest sposób na uruchomienie powłoki w bieżącym katalogu? Przykład tego, czego pragnę, jest następujący cd ~/Projects ; screen ; pwd #=> ~/Projects. Jednak po dodaniu shell -$SHELLdo mnie ~/.screenrcotrzymujęcd ~/Projects ; screen ; pwd #=> ~/
rudolph9,
9

W zależności od tego, jak przyzwyczaiłeś się do uruchamiania Bash, być może korzystasz z powłoki logowania. Po uruchomieniu screenuruchamiasz interaktywną powłokę bez logowania.

Różnica polega na tym, w jaki sposób uruchamiane są skrypty startowe.

  • /etc/bash.bashrcnastępnie ~/.bashrcsą pozyskiwane podczas non-login interaktywna powłoka jest uruchamiany

  • /etc/profilewtedy pierwszy znaleziono w ~/.bash_profile, ~/.bash_logini ~/.profilesą pozyskiwane podczas interaktywnego logowania shell jest uruchamiany

To może na ciebie wpływać.

Sprawdziłbym również, czy $TERMjest inaczej.

Wstrzymano do odwołania.
źródło
2

screen nie zastępuje basha, uruchamia go lub jakąkolwiek inną powłokę. Może to działa csh, zshalbo bash, ale z różnych paramters.

pierwszą rzeczą, którą spróbuję, jest sprawdzenie psi /proc/<pid>/cmdlineupewnienie się, że używa tej samej powłoki z tymi samymi parametrami co loginrobi.

następnie sprawdź /etc/screenrci wszelkie inne pliki wymienione w man screensekcji PLIKI.

Javier
źródło
Uruchomiłem pspolecenie i pokazuje, że bashjest uruchomione (jest to polecenie ps na ekranie) ... Mam kolor działający (powyżej) po prostu potrzebuję uzupełnienia tabulacji.
thornomad
2

Miałem ten sam problem, kiedy uruchomiłem ekran, zgubiłem fajny kolor PS1, który umiejętnie znalazłem: P.

Problem polega na tym, że działałem tak w ~ / .bash_profile

PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "

Oznacza to, że gdy screen działał na bash_profile, PS1 nie jest przenoszone.

Naprawienie jest łatwe: dodaj eksport do instrukcji PS1 w pliku ~. / Bash_profile, aby wyglądał następująco:

export PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "

W ten sposób zmienna nie jest tracona w zagnieżdżonym wykonaniu.

davidsaliba
źródło
1

Chcę tylko dodać coś o „defshell-bash” (co właśnie wymyśliłem, po miesiącach drapania głowy). Kiedy to zrobisz, powłoka potomna uruchamiana przez screen ma $ SHELL ustawioną na „bash”, zamiast „/ bin / bash”, jak to zwykle bywa. Jeśli następnie uruchomisz „skrypt” w sesji ekranowej, otrzymasz:

$ script
Script started, file is typescript
script: failed to execute bash: No such file or directory

A przynajmniej tak dzieje się na moim Ubuntu 14.04. Obejście, którego używam, to uruchomić $ SHELL=/bin/bash script. Wyobrażam sobie, że źle ustawiony $ SHELL spowoduje uszkodzenie innych rzeczy, ale zauważyłem skrypt.

Roy Smith
źródło
0

Używam tego fragmentu kodu w moim .profileprzed rozpoczęciem inicjalizacji powłoki: 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 }

Następnie, jeśli nie jest uruchomiona żadna sesja ekranowa, ja ... cóż, nie popadam w standardowy monit powłoki. Jest jeszcze jedno sudopytanie o hasło (od 99% czasu loguję się, aby administrować serwerem), a jeśli planuję wykonać długie zadanie, anuluję logowanie do sudo, ręcznie uruchamiam ekran w sesji użytkownika i tam sudo.

Kluczową kwestią jest tutaj „przed każdą inicjalizacją powłoki”, tak więc gdy masz już uruchomioną sesję ekranu, jest ona już inicjalizowana z ustawieniami regionalnymi i innymi rzeczami i nie musisz ponownie jej powtarzać.

AnrDaemon
źródło