Utilizzo della funzione getenv
Domanda
Ho un programma C che stampa ogni variabile d'ambiente, il cui nome è dato da stdin. Stampa variabili come $ PATH, $ USER ma non vede le variabili ambientali che io definisco nella shell di Linux ... Ad esempio, in bash definisco my= 4 e mi aspetto che il programma restituisca 4 quando fornisco l'input "my".
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;
}
Cosa posso fare per migliorare i risultati di getenv? Voglio che mi mostri tutte le variabili ambientali con tutte le eredità dalla shell di Linux. Grazie ..
Soluzione
Esistono due modi:
-
my=4; export my; ./program
-
my=4 ./program
-
env my=4 ./program
Ciascuno di questi metodi ha lo stesso effetto, ma attraverso meccanismi diversi.
-
Questo metodo è specifico per la shell che stai utilizzando, sebbene funzioni in questo modo nella maggior parte delle shell tipiche (le varianti della shell Bourne; le shell derivate da csh sono di nuovo diverse). Questo prima imposta una variabile di shell , poi la esporta in una variabile d'ambiente , quindi esegue il programma. Su alcune shell, puoi abbreviarlo come
export my=4
. La variabile rimane impostata dopo l'esecuzione del programma. -
Anche questo metodo dipende dalla tua shell. Questo imposta la variabile d'ambiente
my
temporaneamente per questa esecuzione di./program
. Dopo l'esecuzione,my
non esiste (o ha il suo valore originale). -
Questo utilizza il programma
env
per impostare la variabile d'ambiente prima di eseguire il programma. Questo metodo non dipende da una particolare shell ed è il più portabile. Come il metodo 2, imposta temporaneamente la variabile di ambiente. In effetti, la shell non ha mai nemmeno saputo chemy
era impostato.
Altri suggerimenti
Se non hai generato un codice tag, è solo una variabile di shell, non una variabile di ambiente.Utilizza export
o export my=4
.
Questo non ha nulla a che fare con C o getenv
.Se si genera un codice tag nella shell, è stata definita una variabile di shell locale.Per renderla una variabile d'ambiente, esegui my=4
.