%% 在函数名中是什么意思?

apa*_*rno 11 bash shell-script environment-variables function

查看 的输出env,我注意到还有以下函数。

BASH_FUNC_mc%%=() {  . /usr/share/mc/mc-wrapper.sh
}
Run Code Online (Sandbox Code Playgroud)

/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
Run Code Online (Sandbox Code Playgroud)

%%函数名中的字符是什么意思?它们是在特定情况下调用的函数,还是允许我以与其他函数不同的方式调用它?

我正在使用 openSUSE 42.3 和 Bash 版本 4.3.42(1)-release (x86_64-suse-linux-gnu),如果这有什么不同的话。

jll*_*gre 15

函数名称是bash为了响应shellshock漏洞而更新的。

有一个名为的函数mc被导出,您的bash版本正在通过添加BASH_FUNC_和替换()来重命名它%%

$ d() { date ; }
$ export -f d
$ env | grep %%
BASH_FUNC_d%% { date
Run Code Online (Sandbox Code Playgroud)

这是bashFlorian Weimer 于 2014 年 9 月 25 日发布的补丁,该补丁引入了此修复程序:

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

请注意,函数名称几乎可以包含任何字符,bash就像一般的命令名称(即文件名)一样,因此%%在这里绝对有效。