Frage Wie kann ich den Bildschirm bitten, sich wie eine Standard-Bash-Shell zu verhalten?


Habe gerade über den Bildschirmbefehl auf Linux erfahren - es ist genial. Ich liebe es. Die tatsächliche Terminal / Eingabeaufforderung im Bildschirm sieht jedoch anders aus und verhält sich anders als meine Standard-Bash-Eingabeaufforderung. Das heißt, die Farben sind nicht die gleichen, Tab Completion scheint nicht zu funktionieren, etc.

Gibt es eine Möglichkeit, dem Bildschirm zu sagen, dass er sich wie eine normale (zumindest normale, wie ich es gewohnt bin) Bash-Eingabeaufforderung benehme?

zusätzliche Information

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

Ich werde die folgenden Vorschläge versuchen, um zu sehen, ob ich das ändern kann $TERM Wert zuerst.


34
2018-03-24 22:24


Ursprung


Nur aus Neugier was OS, und welche Art von Terminal haben Sie beim Startbildschirm? Ich nehme an, Ihre Probleme haben mehr damit zu tun, dass Ihr Terminal etwas falsch macht oder falsch identifiziert. - Zoredache
@Zoredache - Ich habe diese Information 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 in Betracht ziehen, eine Alternative zu sehen (serverfault.com/questions/19240/ ...) - Zoredache


Antworten:


Dank an dieser Beitrag, was ich getan habe, war eine Zeile hinzuzufügen ~/.screenrc:

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

Dann Dinge in deinem ~/.bashrc, /etc/bashrcusw. sollte laufen.


33
2018-03-22 22:51





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

  1. Ändern Sie die Begriffseinstellung in Ihrem .screenrc
  2. modifiziere deine .bashrc Dateien suchen TERM=screen ebenso gut wie TERM=xterm

13
2018-03-25 00:01



Vielen Dank! Ich habe ein $HOME/.screenrc Datei und fügte diese Zeile an die Spitze hinzu: term xterm-color und wa la! Farbaufforderung und die $TERM Werte stimmen überein. Allerdings keine Tab-Vervollständigung ... - thornomad
Sie müssen herausfinden, was die Tab-Vervollständigung aktiviert. Die Standardskripts für die Shellkonfiguration sind nicht vollständig konsistent $TERM; Einige Dinge werden mit xterm sowie xterm-color aktiviert, andere nur nach xterm. Andere Dinge haben andere Schalter. - staticsan


Ich mag die Art, wie du deine Frage geschrieben hast, ich habe mich selbst gefragt und es hat eine Weile gedauert, bis ich es herausgefunden habe. Ich hatte das Glück, ein wenig über die Shell-Invokation zu wissen, also dachte ich, das Problem liege irgendwo da.

Hier sind meine Ergebnisse. Erstens finde ich es persönlich interessant und den Unterschied zwischen einer Login-Shell und einer Nicht-Login-Shell zu kennen. Tu einen man $SHELL und suchen Sie nach dem Abschnitt über INVOCATION, um mehr darüber zu erfahren.

Sie können Ihre aktuelle Shell-Instanz nach einer Login-Shell oder einer Nicht-Login-Shell fragen, indem Sie eine shopt login_shell auf Ihrer Aufforderung. Beachten Sie, dass dies normalerweise eine schreibgeschützte Option ist.

Auf meinen Debian-Systemen screen war immer mit nicht-Login-Shells voreingestellt.

Nach dem Suchen im Internet und Lesen man $SHELLIch testete ein paar Dinge aus und die folgenden zwei Ansätze funktionierten für mich. Im ~/.screenrc Hinzufügen / Aktualisieren einer Zeile wie folgt:

shell -$SHELL

Wenn das nicht funktioniert UND Sie verwenden bashAlternativ können Sie versuchen, wie von geteilt Seamus:

defshell -bash

Wie bereits erwähnt, können Sie testen, ob Ihre aktuelle Shell-Instanz eine Login-Shell ist shopt login_shell auf Ihrer Aufforderung.


11
2018-03-23 10:38



Ausgezeichnete Antwort Kyle. Vielen Dank. - Raymond Kroeker
Ist der Start der Shell im aktuellen Verzeichnis möglich? Ein Beispiel für das, was ich begehre, ist das Folgende cd ~/Projects ; screen ; pwd #=> ~/Projects. Was ich aber nach dem Hinzufügen bekomme shell -$SHELL zu meinem ~/.screenrc ist cd ~/Projects ; screen ; pwd #=> ~/ - rudolph9


Je nachdem, wie Sie Bash ausgeführt haben, führen Sie möglicherweise eine Login-Shell aus. Wenn du rennst screen, Sie führen eine interaktive Shell ohne Login aus.

Der Unterschied besteht darin, dass Startscripts ausgeführt werden.

  • /etc/bash.bashrc dann ~/.bashrc werden bereitgestellt, wenn eine interaktive Shell ohne Login gestartet wird

  • /etc/profile dann der erste gefunden von ~/.bash_profile, ~/.bash_login, und ~/.profile werden bezogen, wenn eine interaktive Login-Shell gestartet wird

Dies könnte dich betreffen.

Ich würde auch nachsehen, ob $TERM ist anders.


9
2018-03-24 23:50





Bildschirm ersetzt bash nicht, es läuft es, oder eine andere Shell. vielleicht läuft es csh, zsh, oder bash aber mit anderen Parametern.

das erste, was ich versuchen würde, ist mit zu überprüfen ps und /proc/<pid>/cmdline um sicher zu gehen, dass es die selbe Shell mit den gleichen Parametern wie verwendet logintut.

Danach überprüfen /etc/screenrc und jede andere Datei, die bei man screen Dateien Abschnitt.


2
2018-03-24 22:56



Ich lief ein ps Befehl und es zeigt, dass bash läuft (dies ist ein ps-Befehl innerhalb des Bildschirms) ... Ich habe die Farbe funktioniert (oben) nur brauchen tab completion. - thornomad


Ich hatte das gleiche Problem, als ich den Bildschirm lief, verlor ich die coole PS1-Farbeingabe, die ich schlau gefunden hatte: P.

Problem ist, dass ich es 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 heißt, wenn der Bildschirm das bash_profile ausgeführt hat, wird die PS1 nicht übertragen.

Die Behebung ist einfach: füge den Export zur PS1-Anweisung im ~. / Bash_profile hinzu, um so zu sehen:

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

So ist die Variable in der verschachtelten Ausführung nicht verloren.


2
2017-09-21 15:18





Ich möchte nur etwas über "defshell -bash" hinzufügen (was ich gerade herausgefunden habe, nach Monaten des Kopfkratzens). Wenn Sie das tun, wird $ SHELL auf die von Shell ausgehende Child Shell gesetzt, anstatt auf "/ bin / bash", wie es normalerweise wäre. Wenn Sie dann "Skript" 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 auszuführen $ SHELL=/bin/bash script. Ich würde mir vorstellen, $ SHELL falsch eingestellt zu haben, wird andere Sachen kaputt machen, aber Script ist, was ich bemerkt habe.


0
2018-03-07 16:57





Ich benutze diesen Ausschnitt in meinem .profile bevor 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 keine Bildschirmsitzung läuft, dann ... ich falle nicht in die Standard-Shell-Eingabeaufforderung. Es gibt eine weitere Aufforderung für sudo password (seit 99% der Zeit, die ich mich logge, um den Server zu verwalten), und wenn ich eine langwierige Aufgabe ausführen möchte, löse ich die sudo-Anmeldung ab, starte den Bildschirm manuell in meiner Benutzersitzung und sudo dort ein.

Der Schlüsselpunkt hier ist "vor jeder Shell-Initialisierung", so dass, wenn Sie bereits eine laufende Bildschirmsitzung haben, es bereits mit Gebietsschema und anderen Sachen initialisiert wurde und Sie es nicht erneut wiederholen müssen.


0
2018-03-02 17:58