web-dev-qa-db-ja.com

関数名で%%はどういう意味ですか?

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)-release(x86_64-suse-linux-gnu)を使用しています。

11
kiamlaluno

関数名はbashによって作成され、 Shellshock 脆弱性への応答として更新されました。

エクスポートされたmcという名前の関数があり、bashバージョンはBASH_FUNC_を前置し、()%%に置き換えることで名前を変更しています。

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

これは、2014年9月25日付でこの修正を導入したFlorian Weimerによるbashパッチです。

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

関数名には、一般的なコマンド名(つまりファイル名)と同じように、bashのほとんどすべての文字を含めることができるため、ここでは%%が確実に有効です。

15
jlliagre

関数名に%文字を使用してbashが非常に満足しているようです:

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

一方、例えばダッシュはそれらを好きではありません:

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

したがって、私が知る限り、%%はbash関数名で特別な意味を持ちません。代わりにXXを使用するのと同じです。これは、マンページでの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.
3
Wodin