Bash

Shell 有效函式名字元

  • January 13, 2017

使用擴展的 Unicode 字元(毫無疑問)對許多使用者很有用。

更簡單的 shell(ash (busybox)、dash)和 ksh 確實失敗了:

tést() { echo 34; }

tést

但是bashmkshlkshzsh似乎允許這樣做。

我知道 POSIX有效函式名稱使用Names的這個定義。這意味著這個正則表達式:

[a-zA-Z_][a-zA-Z0-9_]*

但是,在第一個連結中還說:

實現可以允許函式名中的其他字元作為副檔名。

問題是:

  • 這是否被接受並記錄在案?
  • 在哪裡?
  • 對於哪些貝殼(如果有)?

相關問題:

它可能在shell函式名稱中使用特殊字元嗎?

我對在函式名中使用元字元 (>) 不感興趣。

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, yashksh93ksh我的系統中連結到),pdksh它的派生允許多字節字元作為函式名。

yash 旨在從一開始就支持多字節字元,因此它起作用也就不足為奇了。

您可以參考的其他文件是ksh93

空白是製表符或空格。標識符是以字母或下劃線開頭的字母、數字或下劃線序列。標識符用作變數名的組成部分。vname 是由一個或多個標識符組成的序列,由 . 並且可選地以 .. 開頭。Vnames 用作函式和變數名。單詞是目前 locale 定義的字元集中的字元序列,不包括未引用的元字元。

所以設置為C語言環境:

$ export LC_ALL=C
$ á() { echo 1; }
ksh: á: invalid function name

讓它失敗。

引用自:https://unix.stackexchange.com/questions/245331