Obtenir les variables d'environnement en utilisant le code C
Ici, j'ai écrit un programme en C qui exécute hi.sh
fichier à l'aide de system
appel.
Ici, j'ai utilisé . ./hi.sh
si je veux exécuter ce script dans le même shell
et puis essayer d'obtenir la variable d'environnement à l'aide de la fonction getenv fonction, mais ici, je suis de sortie différent de ce que j'attendais.
La hi.sh
fichier contient
export TEST=10
return
Signifie lorsque j'exécute ce hi.sh
fichier à l'aide de l'appel système, son export TEST
définit la valeur 10 dans la même coquille.
Après cela, je suis en train d'essayer d'obtenir cette valeur de la variable mais son NULL
valeur.
Et si j'exécute ce script manuellement à partir de la console comme . ./hi.sh
puis il fonctionne très bien et je reçois 10 valeur de TEST
à l'aide de getenv("TEST")
fonction.
Code:
#include <stdio.h>
int main()
{
system(". ./hi.sh");
char *errcode;
char *env = "TEST";
int errCode;
errcode = getenv(env);
printf("Value is = %s\n",errcode);
if (errcode != NULL) {
errCode =atoi(errcode);
printf("Value is = %d\n",errCode);
}
}
de sortie :
Value is = (null)
Comment puis-je exporter TEST de la variable dans le programme shell? Si system()
exécute les commandes dans les différents shell alors comment puis-je utiliser C code de programme pour obtenir une variable d'environnement qui est exporté par le shell appelé à l'aide d'un system()
appel?
OriginalL'auteur user1089679 | 2012-04-03
Vous devez vous connecter pour publier un commentaire.
Comme d'habitude, la page de man fait expliquer cela, mais vous avez besoin de lire très attentivement.
En d'autres termes, system() commence par /bin/sh, puis a /bin/sh démarrer la commande que vous souhaitez exécuter.
Donc ce qui se passe ici est que la variable TEST est exporté vers le /bin/sh coquille de l'appel system() implicitement commencé, mais pas pour le programme qui appelle system().
Comment puis-je exporter variable de TEST de programme Shell?
La Source de votre script (configurer l'environnement) avant l'exécution de votre programme C. C'est la façon dont les variables d'environnement ont été conçus pour être utilisés.
OriginalL'auteur Kristof Provost
Le processus de l'enfant ne peut pas définir directement le processus parent de l'environnement. L'approche à l'aide
system()
etgetenv()
est vouée à l'échec, donc.Si vous essayez d'importer la sélection des variables définies par le script
hi.sh
, alors vous avez un couple de choix. Vous pouvez lire le scripthi.sh
et de travailler sur ce qu'il les mettrait à l' (plutôt difficile), ou vous pouvez exécuter le script et le code que vous exécutez un rapport sur l'environnement les variables d'intérêt.Supposons que
hi.sh
jeux de$ENV1
et$ENV2
. Vous pouvez utiliserpopen()
pour obtenir les valeurs de retour de votre programme, etsetenv()
pour définir votre programme de l'environnement. Dans les grandes lignes:Remarque que j'ai inclus le nom de la variable dans l'écho de l'information; cela simplifie la vie. Si votre liste de variables devient difficile à gérer, peut-être vous exécutez
". ./hi.sh; env"
pour obtenir l'intégralité de l'environnement, et ensuite de lire chaque ligne et de travailler à partir de votre liste si son un paramètre variable que vous souhaitez utiliser ou pas. Ou vous pouvez simplement régler la totalité de votre environnement nouveau, si cela vous plaît. Vous devez vérifier que lesetenv()
fonction réussi (elle renvoie zéro lorsqu'il n'réussir). Vous devez également vérifier que lespopen()
a été un succès (fp != 0
). Dans ce contexte, vous pouvez probablement utiliserstrtok()
de chercher la=
séparer le nom de la variable à partir de la valeur; il piétine un octet nul sur la=
, vous donnant une valeur null nom et une valeur null valeur:OriginalL'auteur Jonathan Leffler
Une autre solution possible est d'avoir votre programme
exec
lui-même par un autre shell. Que shell remplacer le programme en cours d'exécution, puis de lire les variables d'environnement, puis de remplacer la coquille avec une nouvelle copie du programme. Vous devez dire à la nouvelle copie qu'il a déjà fait un exec ou ce sera juste de la boucle de le faire plus et plus. Vous pouvez rechercher la variable d'environnement, ou de passer un indicateur de ligne de commande.Non testé exemple:
Vous auriez besoin de les remplacer.avec ce que le vrai nom du programme. Vous voulez probablement pour l'extraire de argv[0] et aussi passer le reste du tableau argv. Mais vous devez reformater le arguments pour travailler comme shell arguments, ils ont donc besoin d'être cité en tant que de besoin, etc.
OriginalL'auteur Zan Lynx
Vous pouvez définir la variable d'environnement dans votre propre processus à l'aide de
setenv()
(quisystem()
ensuite silencieusement transmet à l'enfant les processus, ou explicitement passer les variables en utilisantfork()
etexecve()
pour exécuter le script shell.Ce n'est pas possible. Les Variables ne peuvent être transmises qu'aux nouveaux processus, de ne pas revenir au processus parent. Votre script doit générer une sortie, vous pouvez les récupérer en utilisant
popen()
au lieu desystem()
.OriginalL'auteur Simon Richter