Что означает %% в имени функции?

11

Глядя на вывод env, я заметил, что есть также следующая функция.

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

Содержимое файла /usr/share/mc/mc-wrapper.sh следующее.

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

Что %%означают символы в названии функции? Они делают это функцией, вызываемой в определенных случаях, или они позволяют мне вызывать ее не так, как другие функции?

Я использую openSUSE 42.3 с выпуском Bash версии 4.3.42 (1) (x86_64-suse-linux-gnu), если это имеет какое-либо значение.

kiamlaluno
источник

Ответы:

15

Имя функции было bashсоздано обновленным в ответ на уязвимость в оболочке .

Была mcэкспортирована функция с именем , и ваша bashверсия переименовывает ее, добавляя BASH_FUNC_и заменяя ()на %%.

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

Вот bashпатч Флориана Ваймера, который представил это исправление, от 25 сентября 2014 года:

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

Обратите внимание, что имя функции может содержать почти любые символы, bashкак и имя команды в целом (то есть имя файла), поэтому %%здесь определенно допустимо.

jlliagre
источник
3

Кажется, что bash очень рад использовать символы% в именах функций:

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

тогда как, например, Dash не любит их:

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

Насколько я могу судить, %% не имеет никакого особого значения в имени функции bash. Это все равно, что использовать XX вместо этого. Это несмотря на определение a nameна странице руководства:

   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.
Водин
источник
Но после этого есть =знак равенства %%! Что вызывает назначение там.
αғsнιη
2
Именно так envпечатается определение функции.
Водин