拡張Unicode文字の使用は、多くのユーザーにとって(間違いなく)便利です。
より単純なシェル(ash(busybox)、dash)とkshは以下で失敗します:
tést() { echo 34; }
tést
しかし、 bash 、 mksh 、 lksh 、および zsh はそれを許可しているようです。
POSIX 有効な関数名 がこの 名前 の定義を使用していることを知っています。それはこの正規表現を意味します:
[a-zA-Z_][a-zA-Z0-9_]*
ただし、最初のリンクでは次のようにも述べられています。
実装では、拡張機能として関数名に他の文字を使用できます。
質問は次のとおりです。
関連する質問:
シェル関数名に特殊文字を使用することは可能ですか?
関数名でメタ文字(>)を使用することに興味はありません。
「-」を含むUpstartおよびbash関数名
演算子(減算 "-")が名前の一部であるべきだとは思いません。
POSIXドキュメンテーションはそれを拡張として許可しているので、その動作からの実装を妨げるものは何もありません。
簡単なチェック(zsh
で実行):
$ for Shell in /bin/*sh 'busybox sh'; do
printf '[%s]\n' $Shell
$=Shell -c 'á() { :; }'
done
[/bin/ash]
/bin/ash: 1: Syntax error: Bad function name
[/bin/bash]
[/bin/dash]
/bin/dash: 1: Syntax error: Bad function name
[/bin/ksh]
[/bin/lksh]
[/bin/mksh]
[/bin/pdksh]
[/bin/posh]
/bin/posh: á: invalid function name
[/bin/yash]
[/bin/zsh]
[busybox sh]
sh: syntax error: bad function name
bash
、zsh
、yash
、ksh93
(私のシステムではksh
にリンクされています)、pdksh
およびその派生では、関数名としてマルチバイト文字を使用できます。
yash
マルチバイト文字をサポートするように設計されています 当初から機能しているため、機能するのは当然です。
参照できる他のドキュメントはksh93
:
空白はタブまたはスペースです。識別子は、文字またはアンダースコアで始まる文字、数字、またはアンダースコアのシーケンスです。識別子は、変数名のコンポーネントとして使用されます。 vnameは、で区切られた1つ以上の識別子のシーケンスです。およびオプションで前に。を付けます。Vnameは関数名と変数名として使用されます。 Wordは、引用符で囲まれていないメタ文字を除いて、現在のロケールで定義されている文字セットの文字のシーケンスです。
したがって、C
ロケールに設定します。
$ export LC_ALL=C
$ á() { echo 1; }
ksh: á: invalid function name
失敗させます。
関数は、ファイルシステムのコマンドを含む他のコマンドと同じ名前空間を共有することに注意してください。ほとんどのシステムでは、パスに含まれる文字やバイトに制限はありません。
そのため、ほとんどのシェルは関数の文字を制限しますが、そうする理由はありません。つまり、これらのシェルには、関数で置き換えることができないコマンドがあります。
zsh
とrc
は、/
と空の文字列。 zsh
はNULバイトも許可します。
$ zsh
$ $'\0'() echo nul
$ ^@
nul
$ ""() uname
$ ''
Linux
$ /bin/ls() echo test
$ /bin/ls
test
シェルの単純なコマンドは引数のリストであり、最初の引数は実行するコマンドを導出するために使用されます。したがって、これらの引数と関数名が同じ可能な値を共有し、組み込み関数と関数のzsh
引数で任意のバイトシーケンスを使用できるのは、論理的です。
yo(スクリプト作成者)が定義する関数はyoが呼び出すものなので、ここではセキュリティの問題はありません。
セキュリティの問題が発生する可能性があるのは、たとえば、関数の有効な名前がロケールの影響を受けるシェルなどで、解析が環境の影響を受ける場合です。