O que %% significa em um nome de função?

11

Observando a saída de env, notei que também há a seguinte função.

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

O conteúdo do arquivo /usr/share/mc/mc-wrapper.sh é o seguinte.

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

O que os %%caracteres significam no nome da função? Eles a tornam invocada em casos específicos ou permitem que eu a chame de maneira diferente de outras funções?

Estou usando o openSUSE 42.3, com o Bash versão 4.3.42 (1) -release (x86_64-suse-linux-gnu), se isso faz alguma diferença.

kiamlaluno
fonte

Respostas:

15

O nome da função foi criado por bashatualizado como resposta à vulnerabilidade do shellshock .

Havia uma função nomeada mcque foi exportada e sua bashversão a renomeia, acrescentando BASH_FUNC_e substituindo ()por %%.

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

Aqui está o bashpatch de Florian Weimer que introduziu essa correção, datada de 25 de setembro de 2014:

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

Observe que um nome de função pode conter quase todos os caracteres, bashassim como um nome de comando em geral (ou seja, um nome de arquivo), portanto %%é definitivamente válido aqui.

jlliagre
fonte
3

Parece que o bash está feliz em usar% caracteres nos nomes das funções:

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

enquanto, por exemplo, o traço não gosta deles:

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

Até onde eu sei, %% não tem nenhum significado especial no nome de uma função bash. Seria como usar XX. Isso apesar da definição de a namena 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
fonte
Mas há um =sinal de igual depois %%! O que causa a atribuição lá.
αғsнιη
2
Foi assim que envimprimiu a definição da função.
Wodin 29/10/19