Wie fordere ich den Bildschirm auf, sich wie eine Standard-Bash-Shell zu verhalten?

37

Ich habe gerade etwas über den Bildschirmbefehl unter Linux gelernt - er ist genial. Ich liebe es. Das tatsächliche Terminal / die Eingabeaufforderung auf dem Bildschirm sieht jedoch anders aus und verhält sich anders als meine Standard-Bash-Eingabeaufforderung. Das heißt, die Farben sind nicht gleich, die Tab-Vervollständigung scheint nicht zu funktionieren usw.

Gibt es eine Möglichkeit, wie ich dem Bildschirm sagen kann, dass er sich wie ein normaler (zumindest normaler) Bash-Prompt verhält?

zusätzliche Information

Ich verbinde mich per ssh von einem Mac (Terminal) zu einer kopflosen Linux-Box (Ubuntu). Nach dem Einloggen habe ich TERM=xterm-colorund wenn ich Bildschirm laufen habe ich TERM=screen.

Ich werde die folgenden Vorschläge ausprobieren, um zu sehen, ob ich den $TERMWert zuerst ändern kann.

Dornmutter
quelle
Nur aus Neugier, welches Betriebssystem und welche Art von Terminal haben Sie beim Startbildschirm? Ich würde vermuten, dass Ihre Probleme mehr damit zu tun haben, dass Ihr Terminal etwas falsch gemacht oder falsch identifiziert hat.
Zoredache
@Zoredache - Ich habe diese Informationen zum obigen Beitrag hinzugefügt. Vielen Dank. Ich musste die Einstellungen meines Terminals anpassen, damit die Rücktaste funktioniert ...
thornomad
Ich mag Terminal.app wirklich nicht. Persönlich schlage ich vor, dass Sie eine Alternative in Betracht ziehen, siehe ( serverfault.com/questions/19240/… )
Zoredache

Antworten:

38

Dank dieses Beitrags habe ich eine Zeile hinzugefügt zu ~/.screenrc:

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

Dann Dinge in Ihrem ~/.bashrc, /etc/bashrcetc. sollten laufen lassen.

Seamus Abshere
quelle
13

screen ändert den Begriffstyp in screen. Sie können eines von zwei Dingen tun:

  1. Ändern Sie die Begriffseinstellung in Ihrem .screenrc
  2. Ändern Sie Ihre .bashrcDateien aussehen TERM=screensowieTERM=xterm
staticsan
quelle
4
Vielen Dank! Ich habe eine $HOME/.screenrcDatei erstellt und diese Zeile oben hinzugefügt: term xterm-colorund wa la! Farbaufforderung und die $TERMWerte stimmen überein. Allerdings keine Tab-Vervollständigung ...
Dornomad
Sie müssen herausfinden, was die Tab-Vervollständigung aktiviert. Die Standard-Shell-Konfigurationsskripte sind nicht vollständig konsistent in Bezug auf das, worauf sie basieren $TERM. Einige Dinge werden sowohl mit xterm als auch mit xterm-color möglich sein, andere suchen nur nach xterm. Andere Dinge haben andere Schalter.
Staticsan
11

Mir gefällt die Art und Weise, wie Sie Ihre Frage geschrieben haben. Ich habe mir das Gleiche gefragt und es hat eine Weile gedauert, bis ich es herausgefunden habe. Ich hatte das Glück, bereits ein wenig über Shell-Aufrufe zu wissen, und stellte mir das Problem irgendwo vor.

Hier sind meine Erkenntnisse. Erstens finde ich es persönlich interessant und es lohnt sich, den Unterschied zwischen einer Login-Shell und einer Nicht-Login-Shell zu kennen. Machen Sie a man $SHELLund suchen Sie nach dem Abschnitt INVOCATION, um mehr darüber zu erfahren.

Sie können Ihre aktuelle Shell-Instanz fragen, ob es sich um eine Anmelde-Shell oder eine Nicht-Anmelde-Shell handelt, indem Sie shopt login_shellan Ihrer Eingabeaufforderung ein ausgeben . Beachten Sie, dass dies normalerweise eine schreibgeschützte Option ist.

Auf meinen Debian-Systemen sind screenstandardmäßig Shells ohne Anmeldung installiert .

Nachdem man $SHELLich das Web durchsucht und gelesen hatte , testete ich einige Dinge und die folgenden beiden Ansätze funktionierten für mich. In ~/.screenrchinzufügen / aktualisieren eine Zeile wie folgt:

shell -$SHELL

Wenn das nicht klappt UND Sie verwenden bash, können Sie alternativ versuchen, wie von Seamus geteilt :

defshell -bash

Wie bereits erwähnt, können Sie testen, ob Ihre aktuelle Shell-Instanz eine Anmeldeshell ist, indem Sie sie shopt login_shellan Ihrer Eingabeaufforderung absetzen.

Kyle
quelle
Ist die Möglichkeit, die Shell im aktuellen Verzeichnis zu starten? Ein Beispiel für das, was ich mir wünsche, ist das Folgende cd ~/Projects ; screen ; pwd #=> ~/Projects. Was ich jedoch nach dem Hinzufügen shell -$SHELLzu meinem ~/.screenrccd ~/Projects ; screen ; pwd #=> ~/
bekomme,
9

Je nachdem, wie Sie es gewohnt sind, Bash auszuführen, führen Sie möglicherweise eine Anmeldeshell aus. Wenn Sie ausführen screen, wird eine interaktive Shell ausgeführt , bei der es sich nicht um eine Anmeldung handelt.

Der Unterschied besteht darin, in welchen Startskripten ausgeführt werden.

  • /etc/bash.bashrcwerden dann ~/.bashrcbezogen, wenn eine nicht angemeldete interaktive Shell gestartet wird

  • /etc/profiledann werden die ersten gefundenen von ~/.bash_profile, ~/.bash_loginund ~/.profilebezogen, wenn eine interaktive Login-Shell gestartet wird

Dies kann Sie betreffen.

Ich würde auch prüfen, ob $TERMdas anders ist.

Bis auf weiteres angehalten.
quelle
2

screen ersetzt nicht bash, es führt es aus oder irgendeine andere Shell. Vielleicht läuft es csh, zshoder bashaber mit verschiedenen Parametern.

Das erste, was ich versuchen würde, ist zu überprüfen psund /proc/<pid>/cmdlinesicherzustellen, dass es die gleiche Shell mit den gleichen Parametern verwendet wie logintut.

Überprüfen Sie danach /etc/screenrcalle anderen Dateien, die im man screenAbschnitt DATEIEN aufgeführt sind.

Javier
quelle
Ich habe einen psBefehl ausgeführt und es bashwird angezeigt , dass dieser ausgeführt wird (dies ist ein ps-Befehl innerhalb des Bildschirms).
Dornomade
2

Ich hatte das gleiche Problem, als ich den Bildschirm laufen ließ, verlor ich die coole PS1-Farbaufforderung, die ich geschickt gefunden hatte: P.

Das Problem ist, dass ich es so in ~ / .bash_profile ausgeführt habe

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

Das bedeutet, dass die PS1 nicht übertragen wird, als auf dem Bildschirm das bash_profile ausgeführt wurde.

Das Problem lässt sich leicht beheben: Fügen Sie der PS1-Anweisung in ~. / Bash_profile den folgenden Export hinzu:

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

So geht die Variable bei der verschachtelten Ausführung nicht verloren.

Davidsaliba
quelle
1

Ich möchte nur etwas über "defshell -bash" hinzufügen (was ich gerade herausgefunden habe, nachdem ich monatelang am Kopf gekratzt habe). Wenn Sie dies tun, hat die von screen ausgeführte untergeordnete Shell $ SHELL auf "bash" gesetzt, anstelle von "/ bin / bash", wie es normalerweise der Fall wäre. Wenn Sie dann "script" in Ihrer Bildschirmsitzung ausführen, erhalten Sie:

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

Oder zumindest passiert das auf meiner Ubuntu 14.04-Box. Die Problemumgehung, die ich verwendet habe, ist zu laufen $ SHELL=/bin/bash script. Ich könnte mir vorstellen, dass die falsche Einstellung von $ SHELL andere Dinge kaputt macht, aber das Skript ist mir aufgefallen.

Roy Smith
quelle
0

Ich verwende dieses Snippet in meinem, .profilebevor eine Shell-Initialisierung gestartet wird: 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 }

Wenn dann keine Bildschirmsitzung ausgeführt wird, falle ich nicht in die Standard-Shell-Eingabeaufforderung. Es gibt eine weitere Eingabeaufforderung für sudopasword (da ich mich 99% der Zeit zum Verwalten des Servers anmelde). Wenn ich vorhabe, eine längere Aufgabe auszuführen, breche ich die sudo-Anmeldung ab, starte den Bildschirm manuell in der Sitzung meines Benutzers und sudo dort.

Der entscheidende Punkt hierbei ist "vor jeder Shell-Initialisierung", sodass eine laufende Bildschirmsitzung bereits mit dem Gebietsschema und anderen Elementen initialisiert ist und Sie sie nicht erneut ausführen müssen.

AnrDaemon
quelle