¿Qué significa %% en el nombre de una función?

11

Mirando la salida de env, noté que también existe la siguiente función.

BASH_FUNC_mc%%=() {  . /usr/share/mc/mc-wrapper.sh
}

El contenido del archivo /usr/share/mc/mc-wrapper.sh es el siguiente.

MC_USER=`id | sed 's/[^(]*(//;s/).*//'`
MC_PWD_FILE="${TMPDIR-/tmp}/mc-$MC_USER/mc.pwd.$$"
/usr/bin/mc -P "$MC_PWD_FILE" "$@"

if test -r "$MC_PWD_FILE"; then
        MC_PWD="`cat "$MC_PWD_FILE"`"
        if test -n "$MC_PWD" && test -d "$MC_PWD"; then
                cd "$MC_PWD"
        fi
        unset MC_PWD
fi

rm -f "$MC_PWD_FILE"
unset MC_PWD_FILE

¿Qué %%significan los caracteres en el nombre de la función? ¿Lo convierten en la función invocada en casos específicos, o me permiten llamarlo de manera diferente a otras funciones?

Estoy usando openSUSE 42.3, con Bash versión 4.3.42 (1) -release (x86_64-suse-linux-gnu), si eso hace alguna diferencia.

kiamlaluno
fuente

Respuestas:

15

El nombre de la función fue creado por bashactualizado como respuesta a la vulnerabilidad shellshock .

Hubo una función llamada mcque se exportó y su bashversión la renombra al anteponerla BASH_FUNC_y reemplazarla ()por %%.

$ d() { date ; }
$ export -f d
$ env | grep %%
BASH_FUNC_d%% { date

Aquí está el bashparche de Florian Weimer que introdujo esta corrección, fechada el 25 de septiembre de 2014:

http://seclists.org/oss-sec/2014/q3/att-693/variables-affix.patch

Tenga en cuenta que el nombre de una función puede contener casi cualquier carácter, bashcomo el nombre de un comando en general (es decir, un nombre de archivo), por %%lo que definitivamente es válido aquí.

jlliagre
fuente
3

Parece que bash está muy contento de usar% caracteres en los nombres de funciones:

bash$ TEST%%() { echo test; }
bash$ TEST%%
test

mientras que, por ejemplo, a dash no le gustan:

$ TEST%%() { echo test; }
dash: 1: Syntax error: Bad function name

Por lo que puedo decir, %% no tiene ningún significado especial en el nombre de una función bash. Sería como usar XX en su lugar. Esto a pesar de la definición de a nameen la página de manual:

   name   A word consisting only of  alphanumeric  characters  and  under-
          scores,  and beginning with an alphabetic character or an under-
          score.  Also referred to as an identifier.
Wodin
fuente
¡Pero hay un =signo igual allí después %%! Lo que causa la asignación allí.
αғsнιη
2
Así es como se envimprime la definición de la función.
Wodin