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


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)-release(x86_64-suse-linux-gnu)を使用していますが、違いがある場合は、

回答:


15

関数名はbashshellshock脆弱性への応答として更新されて作成されました。

という名前の関数mcがエクスポートされており、bashバージョンの先頭にBASH_FUNC_を付けて置き換え()て名前を変更しています%%

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

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

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

関数名にはbash、一般的なコマンド名(ファイル名)と同様にほぼすべての文字を含めることができるため、%%ここでは間違いなく有効です。


3

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

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

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

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

したがって、私が知る限り、%%はbash関数名で特別な意味を持ちません。代わりにXXを使用するのと同じです。これはname、マンページでのaの定義にもかかわらずです。

   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関数定義を印刷した方法です。
Wodin、2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.