Kann ich ein neues Terminal erzeugen, das ein Klon des aktuellen Terminals ist?

8

Nehmen wir also an, ich entwickle Code im Verzeichnis / asdf / qwer / dfgh / wert / asdf / qwer und habe meinem Pfad ungefähr drei weitere Verzeichnisse hinzugefügt, und ich habe eine Reihe von arkanen Umgebungsvariablen festgelegt. Dann merke ich, dass ich wirklich ein anderes Terminal brauche, das auf die gleiche Weise geöffnet und eingerichtet wird (obwohl dieses Bedürfnis nicht immer wieder auftritt, so dass ich nur meine .bashrc ändern würde). Gibt es einen Befehl zum Öffnen eines neuen Terminalfensters, das genau der Klon dieses Fensters ist?

John Berryman
quelle

Antworten:

10

Das Klonen des Pfads ist einfach, wenn Sie Ihr Terminalprogramm über die Befehlszeile ausführen können. Angenommen, Sie verwenden xterm, führen Sie einfach xterm &die Eingabeaufforderung des Terminals aus, das Sie klonen möchten. Das neue xterm wird im selben Verzeichnis gestartet, es sei denn, Sie haben es so konfiguriert, dass es als Anmeldeshell gestartet wird. Alle exportierten Umgebungsvariablen werden ebenfalls übertragen, nicht exportierte Variablen jedoch nicht.

Eine schnelle und schmutzige Methode zum Klonen der gesamten Umgebung (einschließlich nicht exportierter Variablen) ist wie folgt:

# from the old shell:
set >~/environment.tmp

# from the new shell:
. ~/environment.tmp
rm ~/environment.tmp

Wenn Sie benutzerdefinierte Shell-Optionen festgelegt haben, müssen Sie diese ebenfalls erneut anwenden.

Sie können diesen gesamten Prozess in ein leicht ausführbares Skript einbinden. Lassen Sie das Skript die Umgebung in einer bekannten Datei speichern und dann ausführen xterm. Lassen Sie Ihre .bashrc-Datei nach dieser Datei suchen, sie beschaffen und löschen, wenn sie gefunden wird.


Wenn Sie nicht ein Terminal von einem anderen aus starten oder nur mehr Kontrolle wünschen, können Sie alternativ zwei Funktionen verwenden, die Sie in .bashrc definieren:

putstate () {
    declare +x >~/environment.tmp
    declare -x >>~/environment.tmp
    echo cd "$PWD" >>~/environment.tmp
}

getstate () {
    . ~/environment.tmp
}

BEARBEITEN : Geändert, putstateso dass der "exportierte" Status der Shell-Variablen kopiert wird, um mit der anderen Methode übereinzustimmen. Es gibt andere Dinge, die ebenfalls kopiert werden könnten, z. B. Shell-Optionen (siehe help set). Daher gibt es in diesem Skript Raum für Verbesserungen.

Jander
quelle
Wow ... coole Erklärung, die zu einigen Einsichten führt, die ich vorher hatte.
John Berryman
Ich habe Ihr Skript so modifiziert, dass es ein Argument aufnimmt und den Put platziert und die Umgebung in eine Datei mit dem Namen argumentiert ... jetzt kann ich mehrere Umgebungen haben! : D
John Berryman
Frage: Was macht "." in getstate tun?
John Berryman
Das "." sagt: "Führen Sie den Inhalt dieser Datei mit der aktuellen Shell aus, als ob sie in der Befehlszeile eingegeben worden wären." Ohne das "." bashWürde eine neue Kopie von die Befehle in der Datei ausführen und dann beenden, und die Umgebung der aktuellen Shell würde sich nicht ändern.
Jander
0

Wenn Sie screenin Ihrer definierten Umgebung einen (GNU-Bildschirm) starten , wird diese Umgebung vom Unterprozess (dh screen) verwendet und Sie können damit neue Terminals erzeugen. Aber wenn Sie es ein anderes Mal (a screenin a screen) gabeln wollen, wird es schwierig.

Shellholic
quelle
0

In einer ähnlichen Situation fand ich es auch nützlich, die neue Shell im selben Verzeichnis wie die aktuelle zu starten. Ich habe ein Rezept wie dieses verwendet, um die Shell zu starten.

exec ssh -t $HOST "cd $DIR; $SHELL $parms"

Die Option -t wird immer dann benötigt, wenn Sie eine Shell explizit mit ssh ausführen. Dadurch wird eine Pseudo-Tty für den Prozess erstellt. Dies ist erforderlich, damit Verlaufsbefehle und andere interaktive Funktionen ordnungsgemäß funktionieren. Frühere Zeilen im Skript setzen DIR auf das aktuelle Verzeichnis und SHELL auf die vom Benutzer bevorzugte Shell.

Chris Quenelle
quelle
0

Während exportierte Variablen mit der obigen Funktion 'getstate' auf die andere Seite gelangen, werden sie aus irgendeinem Grund dort nicht exportiert (wie mit einem einfachen os.getenv aus Python zu sehen ist). Es scheint für mich besser zu funktionieren, wenn getstate als Alias ​​geändert wird:

alias getstate=". ~/environment.tmp"
srepmub
quelle