2012-12-20 3 views
8

Ich versuche, eine .screenrc Datei zu schreiben, die ich verwenden kann, um für ein Entwickeln auf einem bestimmten Projekt einzurichten - Es wird ein paar Bildschirme starten, CD an den richtigen Stellen, öffnen Sie die richtige Dateien in einem Editor und legen einige Umgebungsvariablen fest, die zum Testen benötigt werden.Umgebungsvariablen in .screenrc setzen

Ich kann nicht das Umwelt-Setup zu arbeiten .. Ich habe dies in `~/.screenrc versucht setzen:

setenv PATH ~/src/my_proj/bin/:$PATH 

Dies funktioniert nicht, und ich denke, das Problem ist, dass nach screen Sets PATH, Die regulären Shell-Initialisierungs-Skripte treten ein und ändern sie bei mir.

Ich möchte nicht die regulären Shell-Init-Skripte deaktivieren. Gibt es eine Möglichkeit, Bildschirm setenv nach die Shell initialisiert wird? Oder alternativ, kann Bildschirm eine Variable auf schreibgeschützt setzen?

Antwort

1

Es gibt keine Möglichkeit, dass screen die Umgebungsvariablen eines Shell-Prozess ändern kann, sobald dieser Prozess gestartet hat, noch ist es eine Möglichkeit, eine Umgebungsvariable schreibgeschützt zu machen (Werte in jedem Prozess Speicher gespeichert sind, und jeder Prozess vollen Zugang zu ihnen).

(Na ja, könnte es einige hässliche systemspezifische Art und Weise, es zu tun, aber es ist die Art von Dingen Unix-ähnliche Systeme entwickelt werden, um Sie zu tun.)

Sie werden Ihre ändern müssen Shells Initialisierungsskript, so dass es den vorhandenen Wert von $PATH beibehält und möglicherweise hinzufügt, anstatt es auf einen neuen Wert zu setzen und seinen vorhandenen Wert zu ignorieren.

Wenn Sie dies bedingt tun möchten, können Sie das Vorhandensein von $STY testen, das nur gesetzt wird, wenn die Shell (oder ein anderer Prozess) unter screen ausgeführt wird.

Auch screen 's setenv Befehl scheint das ~ Zeichen nicht zu erkennen. Ich habe versucht, eine ähnliche setenv zu einem temporären screenrc hinzuzufügen, und $PATH enthielt ein literales ~ Zeichen. bash scheint die ~ Syntax in $PATH zu erkennen, aber andere Shells nicht. Ersetzen Sie die ~ durch $HOME, die screen erkennt.

5

Ich würde es stattdessen mit etwas Bash Magie tun. Versuchen Sie, so etwas zu Ihrer ~/.screenrc Datei:

screen -t "window" bash -ic 'PATH=~/src/my_proj/bin/:$PATH bash' 

Weitere Informationen und dieses Set zu haben, für neu erstellte Fenster mit Ctrl-a Ctrl+c oder Ctrl-a c siehe meine Antwort auf einen anderen Beitrag: https://stackoverflow.com/a/21717641/1413849

+0

Das Problem, das ich mit dieser Lösung habe, ist, dass es reguläre Shell-Initialisierungstests überschreibt. Zum Beispiel modifiziere ich PATH in ~/.bashrc, was das ändert. – ajwood

+0

Es sollte Ihre Änderungen nicht löschen, da sie wahrscheinlich nur vorhandene Umgebungsvariablen, insbesondere PATH, anhängen sollten. Das Schlimmste, was passieren sollte, ist, wenn sie etwas tun wie: 'PATH = $ PATH:/einige/andere/dir 'oder' PATH =/einige/andere/dir', da Sie keine Möglichkeit haben, '/ einige/andere zu setzen/dir hat Vorrang vor anderen Verzeichnissen. Gibt es ein konkreteres Beispiel, das Probleme auf diese Weise verursacht? –

1

für mich die Linie

setenv PATH /home/someuser/bin:$PATH 

in der screenrc Datei hat den Trick.

Ich denke, die Erweiterung von '~' zu '/ home/someuser' ist bash-spezifisch und wird nicht innerhalb des screenrc funktionieren.

0

Für mich, habe ich gerade Umgebung in ~/.bash_profile oder ~/.bashrc

case $TERM in 
screen*) 
    export PS1='[\u:screen \w]\$ ' 
    ;; 
*) 
    export PS1='[\u \w]\$ ' 
    ;; 
esac 

Es funktionierte, es genießen.

+0

Dies ist der Antwort von Keith Thompson ähnlich, außer dass er die Verwendung von '$ STY' Existenz anstelle von' $ TERM == 'Bildschirm'empfiehlt – ajwood