¿Hay nombres de variables de entorno que el usuario/una llamada no pueden sobrescribir setenv
? Según tengo entendido por POSIX1.2008, cualquier proceso puede editar el bloque de entorno, pero debe evitar sobrescribir variables como LANG, etc.
Respuesta1
El entorno es una lista de cadenas de la forma var=value
(por convención) que se pasa como tercer argumento a la llamada al sistema execve().
Esa lista se coloca en algún lugar de la pila del proceso cuando comienza a ejecutar el nuevo comando al igual que la lista de argumentos (otra lista de cadenas pasadas como segundo argumento a execve()
).
En los programas que utilizan libc (la mayoría), un código de inicialización llamado antes de main()
invocar la función hace que esas cadenas de entorno estén disponibles como environ
matriz.
libc
También proporciona funciones putenv
que setenv
pueden modificar (una copia de) esa lista que recibió el programa. Esa copia mantenida y modificada se pasará al siguiente comando ejecutado por el proceso o cualquiera de sus hijos a través de las funciones execvp()
// execl()
/ system()
... popen()
de la libc (que a su vez terminan llamando a la execve()
llamada del sistema).
Ahora, mientras crea una lista de cadenas que pasa manualmente a la execve()
llamada al sistema, puede pasar cadenas como foo
(sin un =
carácter) o =bar
(con un nombre de variable vacío), setenv
no le permitirá hacerlo ( setenv("", "bar", 1)
se rechaza).
setenv("a=b", "c")
también será rechazado. Por lo tanto, las cadenas que se definirán setenv
siempre tendrán un formato x=y
que x
no podrá estar vacío.
Esa es aproximadamente la única restricción (también aplicada por putenv
). Bueno, aquellas que son cadenas terminadas en NUL, por supuesto, el carácter NUL no puede aparecer en el nombre o valor de la variable.
setenv("*", "x", 1)
, o setenv("\n\n", "", 1)
están todos bien en lo que setenv()
respecta al núcleo. Ahora bien, si vas a poder hacer algo útil con ellos es otra cuestión.
Respuesta2
No, no existen restricciones sobre qué variables de entorno puede cambiar un proceso. Sin embargo, tenga en cuenta que cada proceso tiene supropia copiadel entorno heredado, y un proceso no puede cambiar ninguna variable de entorno en ningún otro proceso. La setenv
llamada sólo puede modificar el entorno dentro del proceso de llamada.
Respuesta3
export MYENV=value
readonly MYENV
Respuesta4
Creo que depende completamente del shell que estés ejecutando.
En Bash UID
es uno BASH_VERSINFO
es otro según la página de manual.
Por otro lado en csh según el manualLas variables de entorno no se pueden convertir en de solo lectura.