Skip to content

Un script shell peut-il définir les variables d’environnement du shell appelant ?

Solution:

Utilisez la syntaxe d’appel “dot space script”. Par exemple, voici comment procéder en utilisant le chemin complet d’un script :

. /path/to/set_env_vars.sh

Et voici comment faire si vous êtes dans le même répertoire que le script :

. set_env_vars.sh

Ceux-ci exécutent le script sous le shell actuel au lieu d’en charger un autre (ce qui se passerait si vous le faisiez ./set_env_vars.sh). Comme il s’exécute dans le même shell, les variables d’environnement que vous définissez seront disponibles à sa fermeture.

C’est la même chose que d’appeler source set_env_vars.sh, mais il est plus court à taper et peut fonctionner dans certains endroits où source pas.

Votre processus shell a une copie de l’environnement du parent et aucun accès à l’environnement du processus parent. Lorsque votre processus shell se termine, toutes les modifications que vous avez apportées à son environnement sont perdues. L’approvisionnement d’un fichier de script est la méthode la plus couramment utilisée pour configurer un environnement shell, vous voudrez peut-être juste mordre la balle et en maintenir un pour chacun des deux types de shell.

Vous ne pourrez pas modifier le shell de l’appelant car il se trouve dans un contexte de processus différent. Lorsque les processus enfants héritent des variables de votre shell, ils héritent eux-mêmes des copies.

Une chose que vous pouvez faire est d’écrire un script qui émet les commandes correctes pour tcsh ou sh en fonction de la façon dont il est invoqué. Si votre script est “setit”, alors faites :

ln -s setit setit-sh

et

ln -s setit setit-csh

Maintenant, soit directement, soit dans un alias, vous le faites depuis sh

eval `setit-sh`

ou ceci de csh

eval `setit-csh`

setit utilise $0 pour déterminer son style de sortie.

Cela rappelle la façon dont les gens utilisent pour obtenir l’ensemble de variables d’environnement TERM.

L’avantage ici est que setit est simplement écrit dans le shell de votre choix, comme dans :

#!/bin/bash
arg0=$0
arg0=${arg0##*/}
for nv in 
   NAME1=VALUE1 
   NAME2=VALUE2
do
   if [ x$arg0 = xsetit-sh ]; then
      echo 'export '$nv' ;'
   elif [ x$arg0 = xsetit-csh ]; then
      echo 'setenv '${nv%%=*}' '${nv##*=}' ;'
   fi
done

avec les liens symboliques donnés ci-dessus et l’évaluation de l’expression entre guillemets, cela a le résultat souhaité.

Pour simplifier l’invocation pour csh, tcsh ou des shells similaires :

alias dosetit 'eval `setit-csh`'

ou pour sh, bash, etc. :

alias dosetit="eval `setit-sh`"

Une bonne chose à ce sujet est que vous n’avez qu’à maintenir la liste à un seul endroit. En théorie, vous pourriez même coller la liste dans un fichier et mettre cat nvpairfilename entre “in” et “do”.

C’est à peu près comme cela que les paramètres du terminal du shell de connexion étaient effectués : un script produirait des instructions à exécuter dans le shell de connexion. Un alias serait généralement utilisé pour simplifier l’invocation, comme dans “tset vt100”. Comme mentionné dans une autre réponse, il existe également des fonctionnalités similaires dans le serveur de nouvelles INN UseNet.



Articles Similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.