La variable de entorno “BASH_FUNC_which%%” de la shell de RHEL 8.5 causa que los pods de K8S fallen.
Problema
Después de migrar a RHEL 8.5 desde 8.4, comenzaron a ocurrir fallos en los pods de K8S.
spec.template.spec.containers[0].env[52].name: Valor inválido: "BASH_FUNC_which%%": un nombre válido de variable de entorno debe
estar compuesto por caracteres alfabéticos, dígitos, '_', '-', o '.', y no debe comenzar con un dígito (por ejemplo, 'my.env-name', o 'MY_ENV.NAME', o 'MyEnvName1', la expresión regular utilizada para la validación es '[-._a-zA-Z][-._a-zA-Z0-9]*')
El comando env en el shell de inicio de sesión muestra que BASH_FUNC_which%%
se define de la siguiente manera.
BASH_FUNC_which%%=() { ( alias;
eval ${which_declare} ) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot "$@"
}
Se sugiere que /etc/profile.d/which2.sh
es el que configura BASH_FUNC_which%%
.
- /etc/profile.d/which2.sh
“`
</ul>
<h1>shellcheck shell=sh</h1>
<h1>Script de inicialización para bash, sh, mksh y ksh</h1>
which<em>declare="declare -f"
which</em>opt="-f"
which_shell="$(cat /proc/$$/comm)"
if [ "$which<em>shell" = "ksh" ] || [ "$which</em>shell" = "mksh" ] || [ "$which<em>shell" = "zsh" ] ; then
which</em>declare="typeset -f"
which_opt=""
fi
which ()
{
(alias; eval ${which_declare}) | /usr/bin/which –tty-only –read-alias –read-functions –show-tilde –show-dot "$@"
}
export which<em>declare
export ${which</em>opt} which
“`
Al eliminarlo, se solucionó el problema.
Pregunta
Por favor, ayúdame a entender dónde exactamente se configura BASH_FUNC_which%%
en RHEL 8.5 y cuál es el propósito de este BASH_FUNC_which%%
, por qué se introdujo en RHEL.
davy.ai
Respuesta
Configuración de BASH_FUNC_which%% en RHEL8.5
En RHEL8.5, el script de inicialización
/etc/profile.d/which2.sh
configura la variable de entornoBASH_FUNC_which%%
. El script define una función llamadawhich
que se utiliza para encontrar la ubicación de un archivo binario ejecutable. La definición de esta función se almacena enBASH_FUNC_which%%
, que es una instancia de un tipo especial de variable de entorno que se define en Bash cuando se exporta una función.Propósito de BASH_FUNC_which%%
El propósito de la variable de entorno
BASH_FUNC_which%%
es almacenar una función de shell que se puede utilizar para encontrar la ubicación de un archivo ejecutable. Esta función se define mediante el script de inicialización/etc/profile.d/which2.sh
, que crea un alias llamadowhich
que invoca a la función. La funciónwhich
busca en la variable de entorno PATH del usuario y devuelve la ubicación del primer archivo ejecutable que coincide con el nombre especificado. También resuelve cualquier alias o función de shell que pueda estar definida para el nombre dado.Introducción de BASH_FUNC_which%% en RHEL
La variable de entorno
BASH_FUNC_which%%
se ha introducido en RHEL como parte del entorno de shell predeterminado para proporcionar una herramienta más completa para encontrar y ejecutar comandos. El uso de la funciónwhich
simplifica el proceso de ubicación y ejecución de comandos, especialmente cuando se instalan varias versiones de un comando o cuando la variable de entorno PATH del usuario está configurada para incluir ubicaciones no estándar. Además, la función proporciona un mecanismo para resolver alias o funciones de shell que puedan interferir con la ejecución del comando deseado. Sin embargo, en algunos casos, como al ejecutar un contenedor, esta función puede causar problemas debido a los caracteres especiales en su nombre.