Ich benutze den Bildschirm täglich für meine Terminalanforderungen und bin ziemlich zufrieden damit. Vor kurzem jedoch habe ich einige Updates an meine Bash - Konfigurationsdateien und ich bemerkte , dass ich verschiedene einstellen PATH
Elemente ( PATH
, MANPATH
, INFOPATH
, usw.) in 2 Stellen. Ich habe die Dateien so geändert, wie sie sein sollten, und jetzt werden alle meine Umgebungsvariablen einmal festgelegt .bash_profile
. Hierin liegt mein Problem.
Anscheinend war der Grund, warum ich sie an zwei Stellen eingestellt habe, der Bildschirm. Bildschirm erscheint nur auszuführen .bashrc
und nicht nicht erscheinen meine erben PATH
oder jede andere Umgebungsvariablen korrekt von meiner ursprünglichen Bash - Shell. Da es nur ausgeführt wird .bashrc
und ich jetzt .bash_profile
nur meine Variablen einstelle , erhalte ich eine unvollständige PATH
.
Meine Frage ist also, wie ich meine Umgebungsvariablen ohne Duplizierung auf den Bildschirm bringen kann. Das Lesen der Bash
Dokumente scheint darauf hinzudeuten, dass es sich um die Art von Shell handeln könnte, die der Bildschirm zum Anmelden verwendet, dh eine interaktive Shell ohne Anmeldung, aber ich konnte nicht herausfinden, wie der Bildschirm gezwungen werden kann, eine bestimmte Art von Shell zu verwenden, nur die Shell zu verwenden über -s /bin/bash
.
Sie können meine Konfigurationsdateien auf meiner GitHub-Seite lesen . Dies ist das Commit-Commit, das den Bildschirm beschädigt hat .
EDIT: Ich benutze Screen version 4.00.03 (FAU) 23-Oct-06
und ich neige dazu, es durch aufzurufenscreen -h 50000
BEARBEITEN: Ich konnte dies jetzt auf Cygwin ( CYGWIN_NT-5.1 1.7.1(0.218/5/3) i686
, Screen version 4.00.03 (FAU) 23-Oct-06
) testen und es zeigt ein anderes Verhalten als auf meinem Mac.
Das spezifische Verhalten, das ich jetzt entdeckt habe, ist, dass in Cygwin die Änderungen, die ich PATH
in .bash_profile vornehme, beim Aufrufen des Bildschirms dupliziert werden und die sukzessive Erstellung von Bildschirmfenstern den Pfad nicht dupliziert, sondern .bash_profile neu erstellt.
Um das Verhalten zu veranschaulichen, von dem ich spreche:
Ausgabe von einem neuen Terminal:
...
PATH: /home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/Program Files/ATI Technologies/ATI.ACE/Core-Static:/groovy-1.6.1/bin:/usr/lib/lapack
MANPATH: /home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man::/usr/ssl/man
Aliases:
alias ..='cd ..'
alias ...='cd ../..'
...
[~]$
Ausgabe vom ersten Aufruf des Bildschirms:
[~]$ screen -h 50000 -s -/bin/bash
...
PATH: /home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/Program Files/ATI Technologies/ATI.ACE/Core-Static:/groovy-1.6.1/bin:/usr/lib/lapack
MANPATH: /home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man:/home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man::/usr/ssl/man:/usr/ssl/man
Aliases:
alias ..='cd ..'
alias ...='cd ../..'
...
[~]$
Nachfolgende Anrufe an C-a c
:
...
PATH: /home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/Program Files/ATI Technologies/ATI.ACE/Core-Static:/groovy-1.6.1/bin:/usr/lib/lapack
MANPATH: /home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man:/home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man::/usr/ssl/man:/usr/ssl/man
Aliases:
alias ..='cd ..'
alias ...='cd ../..'
...
[~]$
Du kannst sehen
quelle
Antworten:
Bildschirm- und Umgebungsvariablen
Standardmäßig gibt der Bildschirm alle Umgebungsvariablen an seine Shells (und andere Prozesse) weiter, die er zu Beginn der Sitzung hatte (dh durch erneutes Verbinden wird nicht geändert, welche Umgebungsvariablen neuen Shells zugewiesen werden). Da jedoch sowohl die Konfigurationsdateien des Bildschirms als auch der Shells häufig Umgebungsvariablen ändern, gibt es viele Stellen, an denen unerwartete Änderungen vorgenommen werden können. Es gibt einige Variablen, wie z. B. TERM , deren Bildschirm sich fast immer ändert, aber diese sind im Allgemeinen für die Funktionalität erforderlich, die der Bildschirm bietet.
Angenommen , weder die Konfiguration Ihrer Shell noch die Konfiguration des Bildschirms ändern eine Variable mit dem Namen FOOBAR (insgesamt ziemlich wahrscheinlich). Wenn Sie eine Sitzung mit starten
FOOBAR=foo screen
, haben alle in dieser Sitzung erstellten Shells eine Umgebungsvariable namens FOOBAR mit dem Wert vonfoo
.Bei Variablen, die entweder vom Bildschirm oder von Ihrer Shell geändert werden, wird es komplizierter .
Fehlende Einstellungen bei Verwendung des Bildschirms
Login Shells
Wenn Sie feststellen, dass einige Einstellungen in vom Bildschirm gestarteten Shells fehlen , liegt dies möglicherweise daran, dass Ihre Shell nur so konfiguriert ist, dass diese Einstellungen für "Login" -Shells aktualisiert werden. Die meisten Muscheln verstehen eine spezielle Konvention (in C:
**argv == '-'
) , der Bildschirm zu verwenden , konfiguriert werden kann.Per dem Bildschirm Dokumentation :
Um Bildschirmstart- Shells als "Login" -Shells zu haben, starten Sie den Bildschirm mit
screen -s -/bin/bash
oder fügen Sie diese Zeile zu Ihrem hinzu.screenrc
:Passen Sie den Pfad zu der Shell an, die Sie gerade verwenden.
Bildschirm Konfiguration
Fehlende oder Reset - Umgebungsvariablen auch durch sein könnten
setenv
undunsetenv
Befehle in einer Bildschirm - Konfigurationsdatei. Sie müssen sowohl die .screenrc-Datei in Ihrem Home-Verzeichnis als auch die Datei überprüfen, die Ihre Bildschirmkompilierung als 'system screenrc' verwendet (Sie können einen Befehl versuchenstrings "$(which screen)" | fgrep -i screenrc
, um den Pfadnamen zu finden, der zur Kompilierungszeit konfiguriert wurde - normalerweise / etc / screenrc für einen vom System installierten Bildschirm ; Add-On-Installationen verwenden wahrscheinlich einen anderen Pfadnamen. Sie könnenSCREENRC=/dev/null SYSSCREENRC=/dev/null screen
diese Einstellungsdateien vorübergehend vermeiden, es gibt jedoch eine Option zur Kompilierungszeit, die die effektive Verwendung von SYSSCREENRC verhindert (Vermutlich, damit Systemadministratoren die Erstkonfiguration erzwingen können).Doppelte Einstellungen bei Verwendung des Bildschirms
Es ist ziemlich üblich, einer Umgebungsvariablen wie PATH in den Konfigurationsdateien einer Shell Elemente hinzuzufügen, damit der aktualisierte Wert für normale Shell-Sitzungen (z. B. xterm oder andere Terminalfenster, Konsolensitzungen usw.) verfügbar ist . Wenn solche Elemente in der Konfiguration pro Shell einer Shell hinzugefügt werden (oder, wenn Sie die
-/path/to/shell
oben beschriebene Einstellung verwenden, in der Konfiguration für die Anmeldung pro Shell), enthält die vom Bildschirm gestartete Shell wahrscheinlich mehrere Kopien der hinzugefügten Elemente.Eine Strategie, um dies zu vermeiden, besteht darin, alle Ergänzungen zu Variablen wie PATH in die Konfiguration pro Login Ihrer Shell aufzunehmen und die Verwendung der
-/path/to/shell
Shell-Einstellung mit Bildschirm zu vermeiden .Eine andere Strategie besteht darin, die neuen Elemente nur bedingt zur Variablen hinzuzufügen. Abhängig von der Shell kann der Code dazu etwas kompliziert sein, er kann jedoch normalerweise zur einfachen Verwendung in eine Shell-Funktion eingekapselt werden.
Eine weitere Strategie besteht darin, immer mit einem festen Wert in Ihren Konfigurationsdateien zu beginnen. Dies kann manchmal zu Problemen beim Verschieben Ihrer Konfigurationsdateien von System zu System führen, wenn die Standardwerte erheblich variieren können.
Diagnose
Wenn Sie nicht direkt erkennen können, wo eine bestimmte Änderung stattfindet, können Sie Folgendes versuchen, um festzustellen, wo die Änderung stattfindet.
Überprüfen Sie den aktuellen Wert in Ihrer ursprünglichen Shell:
Überprüfen Sie, wie die Shell selbst den Wert ändert, wenn eine Unter-Shell erstellt wird:
Überprüfen Sie, wie die Shell den Wert ändert, wenn eine 'Login'-Sub-Shell erstellt wird:
Überprüfen Sie, wie der Bildschirm den Wert ändert:
quelle
screen -s -/bin/bash
aber er verhält sich nicht so, wie ich es unter Cygwin auf meinem Arbeitscomputer erwartet habe. Auf diesem Computerscreen -h 50000
starte ich und erbt einfach meine,PATH
ohne die Datei erneut zu beziehen. Dies wird jedes Mal ausgeführt, wenn ich ein neues Fenster starte.FOOBAR=baz screen
,echo $FOOBAR
die Shell-Fenster vonscreen
und einzucheckenscreen -s -/bin/bash
. Beide Variationen solltenFOOBAR
= habenbaz
. Wenn IhrPATH
geändert wird, müssen Sie herausfinden, was es tut. Versuchen SieSYSSCREENRC=/dev/null SCREENRC=/dev/null screen
, wenn das SiePATH
durchlässt, dann ist es wahrscheinlich einsetenv PATH
in/etc/screenrc
oder~/.screenrc
. Ansonsten ist es etwas, was du.bashrc
tust.Das letzte Mal, als ich ein ähnliches Problem sah, löste ich es, indem ich es
screen -l
beim Startbildschirm verwendete.Sie können die
-l
Option beim Aufrufen verwendenscreen
( Anmeldemodus aktivieren ; auch von den Befehlendeflogin
undlogin
gesteuert.screenrc
), um festzulegen, ob der Bildschirm das Fenster standardmäßig anmelden soll (Hinzufügen / Entfernen des Eintrags / etc / utmp).Der Anmeldemodus ist standardmäßig aktiviert, kann jedoch beim Kompilieren geändert werden. Wenn der Bildschirm nicht mit utmp-Unterstützung kompiliert wurde, sind diese Befehle nicht verfügbar.
Ich brauche den
-l
Modus in Debian Lennys Standardbildschirm (v4.0.3) anscheinend nicht. es scheint standardmäßig aktiviert zu sein. Meine~/.profile
und~/.bashrc
werden richtig gelesen. Wie rufst du anscreen
? Welche Version verwenden Sie?quelle
screen -ln
sollte meine nicht laufen~/.profile
, und es wird immer noch laufen. Probieren Sie die-l
Flagge aus, aber dies ist wahrscheinlich nicht die richtige Antwort. werde es für den Moment hier lassen.-l
nur gesteuert wird, obscreen
derutmp
Datei ein Eintrag-l
hinzugefügt wird , nicht, ob neue Shells mit eigener Option aufgerufen werden oder der benutzerdefinierte-
Befehl exec-with- prefix verwendet wird.Das Problem liegt im Startverhalten von Leopard. Sehen Sie sich diesen MacPorts-Fehlerbericht für den Bildschirm auf Leopard an, um zu sehen, warum er niemals behoben werden kann, es sei denn, Sie können den Start von Snow Leopard irgendwie zurückportieren.
https://trac.macports.org/ticket/18235#comment:26
quelle
Es ist nichts Falsches daran, Ihre .bashrc aus .bash_profile zu beziehen. Wenn Sie Ihren Computer nur lokal verwenden, wird Ihr .bash_profile in den meisten Fällen nur bei Ihrer ersten Anmeldung bezogen (es gibt offensichtlich andere Zeiten, in denen es bezogen wird).
Ich organisiere meine Dateien so, dass ich die Informationen in .bash_profile und für alles andere in .bashrc ablege, wenn ich möchte, dass etwas nur beim Anmelden erledigt wird. PATH ist eine Sache, die ich in mein .bashrc eingefügt habe, und ich beziehe .bashrc in mein .bash_profile.
quelle
.bashrc
und.bash_profile
Dateien gerne irgendwo veröffentlichen, damit ich sie sehen kann? Das Problem, auf das ich stieß, als ich etwas Ähnliches tat, war, dassPATH
es jedes Mal größer wurde, wenn ich eine neue Bildschirminstanz erstellte, weil es die alte erbtePATH
und dann alles erneut hinzufügte.Immer , wenn ich habe ein Problem, dass ich eine Datei erstellen
$HOME/.debug
und in alle Dateien sourced / ausgeführt während der Anmeldung / Shell aufgerufen werden (zB~/.bashrc
,~/.bash_profile
,~/.profile
,/etc/bashrc
, etc.) ich als erste Zeile habeno.ä. Für ein bestimmtes Debugging können Sie auch Dinge wie hinzufügen
Auf diese Weise können Sie zu 100% sicher sein, welche Dateien verwendet werden oder nicht.
Die Weiterleitung zu stderr ist wichtig, Sie möchten in vielen Situationen nicht, dass etwas stdout durcheinander bringt.
quelle
Sie können bei .profile bleiben, da das System bashrc nicht berührt (wie bei einer Grafiksitzung). Jetzt haben Sie einfach zwei verschiedene Umgebungsgruppen - eine von .profile und eine für bash von .bashrc.
quelle