El error shellshock en bash funciona a través de variables de entorno. Honestamente, me sorprendió el hecho de que existe una característica como:
"transmisión de definiciones de funciones a través de env vars"
Por lo tanto, esta pregunta, aunque quizás no esté perfectamente formulada, es pedir un ejemplo o un caso en el que sería necesario tener esta función.
Prima. ¿Otros shells zsh, dash, etc. también tienen esta característica?
bash
environment-variables
function
shellshock
humanidad y paz
fuente
fuente
parallel
obtiene las definiciones de funciones distribuidas si invoca múltiples instancias de bash. Si no es así, tendría que escribirlos en un archivo, que cada instancia invocada se lee y luego tiene que lidiar con problemas como cuándo se puede eliminar ese archivo..dot
el mismo archivo que el antiguo shell. así es como se hace, y eso tiene sentido, o se alimenta el nuevo shell al archivo como entrada cuando seexec
ing. una vez que se lee una vez que el archivo está en caché por el núcleo de todos modos.Respuestas:
Cuando una secuencia de comandos invoca otra secuencia de comandos, las variables de la secuencia de comandos principal se pueden exportar y luego serán visibles en la secuencia de comandos secundaria. Exportar funciones es una generalización obvia: exportar la función desde el padre, hacerla visible en el hijo.
El entorno es la única forma conveniente en que un proceso puede pasar datos arbitrarios a sus hijos. Los datos deben agruparse en cadenas que no contengan bytes nulos, lo que no es una dificultad para las funciones de shell. Existen otros métodos potenciales, como bloques de memoria compartida o archivos temporales pasados a través de descriptores de archivos, pero estos podrían causar problemas con programas intermedios que no saben qué hacer con ellos o los cerrarían. Los programas esperan ejecutarse en un entorno que contiene variables que no conocen o no les importan, por lo que no las sobrescribirán ni las borrarán.
La elección de usar el nombre de la función como el nombre de la variable de entorno es extraña. Por un lado, significa que una variable exportada choca con una función exportada del mismo nombre.
Las funciones exportadas son una característica antigua. Se agregaron funciones en el shell Bourne en SVR2 , y las funciones exportadas en el shell de la Versión 8 lanzadas el mismo año (1984). En ese shell, las variables y funciones utilizan el mismo espacio de nombres. No sé cómo funcionó la exportación de funciones. El shell Heirloom se basa en una variante Bourne que tiene funciones pero no las exporta.
ATT ksh supuestamente admite funciones de exportación, pero al mirar la fuente o jugar con ella, no puedo ver que lo haga, a partir de ksh93u.
Los clones de dominio público de Ksh (pdksh, mksh), dash y zsh no admiten funciones de exportación.
fuente
BASH_FUNC_f%%=() { echo hi }
. ¿Por qué bash analizaría otras variables de entorno? ¿Por qué incluso se analizaríaBASH_FUNC_g%%
cuando solo estoy llamandof
? (Aparentemente, antes del shellshock, la variable de entorno acababa de llamarsef
og
, pero todavía me pregunto por quég
habría sido analizada si nunca llamog
en mi script)f
, (1) verificar una función de shell llamadaf
, (2) verificar una variable de entorno llamadaf
e intentar analizarla, (3) verificar cadaPATH
componente para un ejecutable llamadof
. ¿Cómo podría analizar cada variable de entorno como código de shell, en el inicio de shell, parecer un diseño menos complicado?unset -f foo
, bash ya no debe buscar una definición de funciónfoo
en el entorno), al enumerar funciones (¿cómo maneja,declare -f
además de leer todas las variables de entorno?) , y cualquier otra cosa en la que no esté pensando. Su diseño solo parece más fácil porque dejó de lado la mayor parte. Por el contrario, hacer todo en el inicio es una sola pieza de código y después de eso, todo funciona.