2011-03-23 6 views
2

J'ai un programme C qui imprime chaque variable d'environnement, dont le nom est donné par stdin. Il imprime des variables telles que $ PATH, $ USER mais il ne voit pas les variables environnementales je me définis comme dans le shell Linux ... Par exemple, dans bash je définis mon = 4, et je me attends le programme pour revenir 4 quand je donne l'entrée "mon".Utilisation de la fonction getenv

int main () { 
    char * key = (char *)malloc(30); 

    scanf("%s", key); 

    if(getenv(key) != NULL) 
    printf("%s\n", getenv(key)); 
    else 
    printf("NULL\n"); 

    return 0; 
} 

Que puis-je faire pour améliorer les résultats de getenv? Je veux qu'il me montre toutes les variables d'environnement avec tous les héritages du shell Linux. Merci ..

+2

Pas besoin de "malloc" un bloc de longueur fixe. Juste 'char key [30]' ferait l'affaire. (Vous ne 'free' le bloc, btw.) –

+0

@larsmans: Merci pour l'observation, il était seulement un exemple pressé, je avais besoin getenv dans un contexte plus large :) – shaku

Répondre

5

Il y a deux façons:

  1. my=4; export my; ./program
  2. my=4 ./program
  3. env my=4 ./program

Chacune de ces méthodes a le même effet, mais par des mécanismes différents.

  1. Cette méthode est spécifique au shell que vous utilisez, bien que cela fonctionne comme ça dans la plupart des coquilles typiques (variantes Bourne shell, coquilles dérivées csh sont différents à nouveau). Cette première définit une variable shell , il exporte vers une variable d'environnement , puis exécute votre programme. Sur certains shells, vous pouvez abréger ceci en export my=4. La variable reste définie après l'exécution de votre programme.

  2. Cette méthode est également dépendante de votre coquille. Cela définit la variable d'environnement mytemporairement pour cette exécution de ./program. Après l'exécution, my n'existe pas (ou a sa valeur d'origine).

  3. Ceci utilise le programme env pour définir la variable d'environnement avant d'exécuter votre programme. Cette méthode est et non dépend de n'importe quel shell particulier, et est la plus portable. Comme la méthode 2, cela définit la variable d'environnement temporairement. En fait, le shell ne savait même pas que my était défini.

+1

+1: en 1, je vous recommande de remplacer « le plus typique coquilles "avec" Bourne shell variantes "(ou" tous les coquilles utilisables ":)) –

2

Si vous n'avez pas export alors c'est juste une variable shell, pas une variable d'environnement. Utilisez ou my=4; export my.

1

Cela n'a rien à voir avec C ou getenv. Si vous faites my=4 dans le shell, vous avez défini une variable de shell locale. Pour en faire une variable d'environnement, faites export my.