J'utilise Linux, et j'aime faire tout mon travail en ligne de commande dans une seule session d'écran, afin de pouvoir redémarrer ma connexion graphique et autres sans perdre mes terminaux. Cependant, lorsque je me déconnecte et me reconnecte à ma session graphique, cela modifie toutes mes variables d'environnement de session, telles que les sessions DBus. Cela signifie qu'après une nouvelle connexion, ma session d'écran a maintenant les anciennes (et mauvaises) variables d'environnement. Alors maintenant, lorsque j'essaie de démarrer des programmes graphiques à partir de ma session d'écran, ils émettent au mieux un avertissement indiquant qu'ils ne peuvent pas se connecter au bus de session. Au pire, ils ne démarrent pas complètement.
Donc, ce que je recherche, c'est un moyen de modifier les variables d'environnement dans une instance d'écran en cours d'exécution, afin que toutes les fenêtres d'écran créées par la suite héritent des nouvelles variables d'environnement. Y a-t-il un moyen de faire cela?
la source
setenv [var [string]] Set the environment variable var to value string. If only var is specified, the user will be prompted to enter a value. If no parameters are specified, the user will be prompted for both variable and value. The environment is inherited by all subsequently forked shells.
Réponses:
Vous ne pouvez pas démarrer un script shell à partir de la
screen
session car il hériterait de l'ancien environnement. Vous pouvez cependant nous contacter un fifo pour obtenir les nouvelles variables d'environnement dans l'ancienne session d'écran. Vous pouvez remplir ce fifo lorsque vous démarrez votre session graphique.Démarrez ce script en arrière-plan lors de la connexion (il ne se terminera que lorsque toutes les variables en seront lues).
Vous pouvez maintenant lire à partir du fifo, par exemple, ajoutez cette fonction à votre
.bashrc
afin que vous puissiez dans votre ancienne
screen
sessionla source
screen
. AFAIKscreen
n'expose aucun socket ou similaire pour communiquer avec des sessions en cours d'exécution de l'extérieur.screen
session a déjà les variables d'environnement récentesJ'ai implémenté un script pour ce faire. Vous pouvez l'obtenir ici: https://github.com/DarwinAwardWinner/screen-sendenv
Après l'avoir placé
screen-sendenv.py
dans votre$PATH
, vous pouvez utiliser l'extrait de code suivant dans votre .bashrc:Pour l'utiliser, exécutez-le juste
screen_pushenv
avant de vousscreen -r
reconnecter à votre session d'écran. Ensuite, après avoir attaché avecscreen -r
, vous pouvez mettre à jour l'environnement dans vos shells existants avecscreen_pullenv
. Les fonctions tmux accomplissent la même chose pour tmux, un autre multiplexeur de terminal similaire à screen.la source
screen_update
ettmux_update
. Je mettrai à jour ma réponse avec une version indépendante de byobu.setenv
je vois comment c'est mieux. Ce n'était pas évident d'après le code auquel vous avez lié. Merci encore!Vous pouvez appeler la
setenv
commande pour modifier les variables d'environnement dans le processus d'écran de manière interactive, en utilisant: Ctrl- A+:setenv
(Notez le:
caractère pour entrer une commande d'écran.) Vous serez invité à entrer le nom et la valeur de la variable d'environnement.Notez que (selon d'autres réponses / commentaires) cela affecte le processus d'écran (parent) et donc les sessions d'écran nouvellement créées, mais pas votre session d'écran actuelle ni aucune session d'écran existante.
Vous pouvez spécifier le nom et la valeur de la variable d'environnement en même temps si vous le souhaitez: Ctrl- A+
:setenv DISPLAY :100
. Définira l'AFFICHAGE sur ": 100" pour les nouvelles sessions d'écran.Pour supprimer une variable d'environnement, vous pouvez utiliser 'unsetenv' - par exemple Ctrl- A+
:unsetenv DISPLAY
la source
C'est probablement une solution plus simple (vous décidez). La partie importante étant l'alias qui appelle la
savedisplay
fonction à chaquescreen
exécution de la commande. Les commandes ne sont pas exécutées automatiquement, elles peuvent donc être insérées à la~/.bashrc
place de quelque chose de très spécialisé comme~/.ssh/rc
.la source