Bash
Shell 有效函式名字元
使用擴展的 Unicode 字元(毫無疑問)對許多使用者很有用。
更簡單的 shell(ash (busybox)、dash)和 ksh 確實失敗了:
tést() { echo 34; } tést
我知道 POSIX有效函式名稱使用Names的這個定義。這意味著這個正則表達式:
[a-zA-Z_][a-zA-Z0-9_]*
但是,在第一個連結中還說:
實現可以允許函式名中的其他字元作為副檔名。
問題是:
- 這是否被接受並記錄在案?
- 在哪裡?
- 對於哪些貝殼(如果有)?
相關問題:
我對在函式名中使用元字元 (>) 不感興趣。
我不認為運算符(減法“-”)應該是名稱的一部分。
由於 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 是由一個或多個標識符組成的序列,由 . 並且可選地以 .. 開頭。Vnames 用作函式和變數名。單詞是目前 locale 定義的字元集中的字元序列,不包括未引用的元字元。
所以設置為
C
語言環境:$ export LC_ALL=C $ á() { echo 1; } ksh: á: invalid function name
讓它失敗。