Puis-je générer un nouveau terminal qui est un clone du terminal actuel?

Donc, disons que je développe du code dans le directory / asdf / qwer / dfgh / wert / asdf / qwer et j'ai ajouté environ trois autres directorys comme ça à mon path et j'ai un set de variables d'environnement arcane. Ensuite, je me rends count que j'ai vraiment besoin d'un autre terminal ouvert et configuré de la même manière (bien que ce besoin ne se reproduise pas pour que je modifie mon .bashrc). Y at-il une command pour ouvrir une nouvelle window de terminal qui est un clone exact de celui-ci?

Cloner le path est facile si vous pouvez exécuter votre programme terminal à partir de la command line. En supposant que vous utilisez xterm , exécutez simplement xterm & partir de l'invite du terminal que vous voulez cloner. Le nouveau xterm démarrera dans le même directory, à less que vous ne l'ayez configuré comme un shell de connection. Toutes les variables d'environnement exscopes seront également rescopes, mais les variables non exscopes ne le seront pas.

Un moyen rapide et sale de cloner tout l'environnement (y compris les variables non exscopes) est le suivant:

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

Si vous avez défini des options de shell personnalisées, vous devrez également les appliquer.

Vous pourriez envelopper l'set du process dans un script facilement exécutable. Demander au script de sauvegarder l'environnement dans un file connu, puis exécuter xterm . Ayez votre .bashrc vérifier pour ce file, et le source et le supprimer si trouvé.


Alternativement, si vous ne voulez pas démarrer un terminal d'un autre, ou simplement vouloir plus de contrôle, vous pouvez utiliser une paire de fonctions que vous définissez dans .bashrc:

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

EDIT : a changé putstate afin qu'il copy l'état "exporté" des variables de shell, de manière à faire correspondre l'autre méthode. D'autres éléments peuvent également être copiés, comme les options de shell (voir l' help set ), ce qui permet d'améliorer ce script.

Si vous démarrez un screen ( screen GNU) dans votre environnement défini, cet environnement sera utilisé par le sous-process (c'est-à-dire l' screen ) et vous pourrez l'utiliser pour générer de nouveaux terminaux. Mais si vous voulez fourrer une autre fois (un screen dans un screen ) cela commence à être délicat.

Dans une situation similaire, j'ai également trouvé utile de démarrer le nouveau shell dans le même directory que celui en cours. J'ai utilisé une recette comme celle-ci pour démarrer la coquille.

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

L'option -t est nécessaire chaque fois que vous exécutez explicitement un shell en utilisant ssh. Cela provoque la création d'un pseudo-tty pour le process. Ceci est nécessaire pour que les commands d'historique et les autres fonctionnalités interactives fonctionnent correctement. Les lignes antérieures du script définissent DIR sur le directory courant et SHELL sur le shell préféré de l'user.

tandis que les variables exscopes le font de l'autre côté en utilisant la fonction 'getstate' ci-dessus, pour une raison quelconque ils finissent par ne pas y être exportés (comme on peut le voir en utilisant un simple os.getenv de python). il semble mieux fonctionner pour moi en modifiant getstate pour être un alias:

 alias getstate=". ~/environment.tmp"