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)を使用しています。
関数名は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
のほとんどすべての文字を含めることができるため、ここでは%%
が確実に有効です。
関数名に%文字を使用して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.