Establecer variables de entorno en C

5 minutos de lectura

avatar de usuario
iman453

¿Hay alguna forma de establecer variables de entorno en Linux usando C?

Lo intenté setenv() y putenv()pero parece que no funcionan para mí.

  • ¿Por qué crees que no funcionaron? (Es decir, ¿cómo probaste esto? ¿getenv?)

    – Brandon Horsley

    5 de agosto de 2010 a las 15:59

  • ¿Podría publicar un ejemplo de código y una demostración que muestre cómo no funcionan?

    – FrustradoConFormsDesigner

    5 de agosto de 2010 a las 15:59

Voy a hacer una suposición descabellada aquí, pero la razón normal por la que estas funciones parecen no funcionar no es porque no funcionen, sino porque el usuario realmente no entiende cómo funcionan las variables de entorno. Por ejemplo, si tengo este programa:

int main(int argc, char **argv)
{
  putenv("SomeVariable=SomeValue");
  return 0;
}

Y luego lo ejecuto desde el shell, no modificará el entorno del shell; no hay forma de que un proceso secundario haga eso. Es por eso que los comandos de shell que modifican el entorno son incorporados y por eso es necesario source un script que contiene configuraciones variables que desea agregar a su shell, en lugar de simplemente ejecutarlo.

  • El corolario de esto es obtener el comportamiento de “ejecutar programa para establecer variables” en el shell: 1) escriba un script de shell para hacer el trabajo y 2) no lo ejecute de la manera habitual, sino source eso. (Por cierto en la mayoría de las conchas . script es lo mismo que source script y mucho menos escribir).

    – dmckee — gatito ex-moderador

    5 de agosto de 2010 a las 16:08

  • Eso tiene mucho sentido, gracias 🙂 Sí, eso era lo que estaba haciendo. Soy nuevo en Linux, así que disculpe si esta es una pregunta estúpida, pero ¿no hay forma de que un proceso secundario configure el entorno de shells en C y no obtenga un script? Estoy haciendo una pasantía en esta empresa y me pidieron que escribiera una función para configurar la zona horaria de un dispositivo que ejecuta Linux, así que estaba tratando de configurar el entorno TZ del shell.

    – iman453

    5 de agosto de 2010 a las 16:11

  • @iman: prueba man -k tz para algunas opciones. En mi máquina Mac OS X lo que aparece es tzset (3)

    – dmckee — gatito ex-moderador

    5 de agosto de 2010 a las 16:15

  • @dmckee: ¿tzset no seguiría funcionando solo para el proceso en el que ejecuto el código y todos sus procesos secundarios? Más o menos quería una forma en que todos los procesos obtengan esta información (no sé si eso es posible jajaja)

    – iman453

    5 de agosto de 2010 a las 16:18

  • @iman: Sí. Ese consejo parece haber valido cada centavo que pagó por él. Lo siento.

    – dmckee — gatito ex-moderador

    5 de agosto de 2010 a las 16:32

Cualquier programa de Unix se ejecuta en un proceso separado del proceso que lo inicia; este es un proceso ‘hijo’.

Cuando se inicia un programa, ya sea en la línea de comandos o de cualquier otra forma, el sistema crea un nuevo proceso que es (más o menos) una copia del proceso principal. Esa copia incluye las variables de entorno en el proceso padre, y este es el mecanismo por el cual el proceso hijo ‘hereda’ las variables de entorno de su padre. (esto es todo en gran parte lo que han dicho otras respuestas aquí)

Es decir, un proceso sólo siempre establece su propio Variables de entorno.

Otros han mencionado obtener un script de shell, como una forma de establecer variables de entorno en el proceso actual, pero si necesita establecer variables en el proceso actual (shell) mediante programación, entonces hay una forma ligeramente indirecta de hacerlo.

Considera esto:

% cat envs.c
#include <stdio.h>
int main(int argc, char**argv)
{
    int i;
    for (i=1; i<argc; i++) {
        printf("ENV%d=%s\n", i, argv[i]);
    }
}
% echo $ENV1

% ./envs one two
ENV1=one
ENV2=two
% eval `./envs one two`
% echo $ENV1
one
% 

el incorporado eval evalúa su argumento como si ese argumento se hubiera escrito en el indicador de shell. Este es un ejemplo de estilo sh; la variante estilo csh se deja como ejercicio!

  • Me di cuenta de que esto fue rechazado. ¿Alguna indicación de por qué? ¿Alguien detectó un error?

    – Norman Grey

    21 de mayo de 2011 a las 14:06

  • No estoy seguro de por qué alguien rechazaría esto. Extraño. Me parece una buena solución!

    – kodybrown

    27 mayo 2015 a las 17:03

  • Supongo que es porque la respuesta establece la variable de entorno usando el comando bash incorporado ‘eval’, que son las posibilidades de que el programador no pueda usar bash en absoluto. Si al programador se le permite usar un script de shell (que no siempre es el caso, de ahí la pregunta), hay otras formas más obvias y mejores de configurar la variable de entorno que no sea la evaluación específica de bash. (PD: no voté negativo)

    – neuro_sys

    30 de junio de 2015 a las 15:28

  • ¿Cuáles son las otras formas en las que estás pensando? Es cierto que la pregunta es un poco vaga, pero tomé/tomo que preguntaba cómo se establecerían las variables de entorno en un shell, usando un programa. Dado que las únicas formas en que puedo pensar en que las variables se pueden establecer en ese caparazón están usando source o evalhay pocas opciones (por supuesto, si desea que se configuren en el proceso actual o secundario, simplemente use setenv). Tenga en cuenta que eval no es solo bash, está en positivo; No sé cuál es el equivalente *csh.

    – Norman Grey

    1 de julio de 2015 a las 12:29

avatar de usuario
karlphillip

La variable de entorno establecida por setenv()/putenv() se establecerá para el proceso que ejecutó estas funciones y será heredada por los procesos iniciados por él. Sin embargo, no será transmitido en el shell que ejecutó su programa.

¿Por qué no funciona mi contenedor alrededor de setenv()?

El bloque de entorno es local del proceso y se copia en procesos secundarios. Entonces, si cambia las variables, el nuevo valor solo afecta su proceso y los procesos secundarios generados después del cambio. Seguramente no cambiará el shell desde el que se lanzó.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad