Bash

函式、別名和執行檔中的連字元是否存在問題?

  • April 30, 2016

在我的測試中(在 Bash 和 Z Shell 中),我發現定義函式或別名或名稱中帶有連字元的可執行 shell 腳本沒有問題,但我不確定這在所有 shell 和所有案例中都可以.

我想這樣做的原因是連字元比下劃線更容易輸入,因此更快更流暢。

我不願相信這不是問題的一個原因是,在某些語言(例如 Ruby)中,即使周圍沒有空格,連字元也會被解釋為減號。如果在某些 shell 中可能發生這樣的事情,我不會感到驚訝,即使沒有空格,連字元也被解釋為表示選項。

我有點懷疑的另一個原因是我的文本編輯器搞砸了帶有連字元的函式的語法突出顯示。(當然,這完全有可能只是它的語法高亮配置中的一個錯誤,用於 shell 腳本。)

有什麼理由避免使用連字元嗎?

POSIX 和連字元:不保證

根據 POSIX 標準,函式名稱必須是有效名稱,名稱可以包括:

3.231 名稱

在 shell 命令語言中,僅由可移植字元集中的下劃線、數字和字母組成的單詞。名稱的第一個字元不是數字。

此外,別名必須是有效的別名,它可以包括:

3.10 別名

在 shell 命令語言中,僅由可移植字元集中的下劃線、數字和字母以及以下任何字元組成的單詞:’!’、’%’、’,’、’@’。

實現可以允許別名中的其他字元作為副檔名。 (強調我的。)

在任何一種情況下都必須允許的字元中*沒有列出連字元。*因此,如果使用它們,則不能保證可移植性。

不支持連字元的 Shell 範例

dash是 debian-ubuntu 系列的預設 shell ( /bin/sh),它不支持函式名稱中的連字元:

$ a-b() { date; }
dash: 1: Syntax error: Bad function name

有趣的是,它確實支持別名中的連字元,但是,如上所述,這是一個實現特性,而不是要求:

$ a_b() { printf "hello %s\n" "$1"; }
$ alias a-b='a_b'
$ a-b world
hello world

busybox shell (Almquist shell) 也不支持函式名中的連字元:

$ a-b() { date; }
-sh: Syntax error: Bad function name

Shell 對連字元的支持總結

已知以下 shell 支持函式名稱中的連字元:

  • ksh、bash、zsh

已知以下 shell支持函式名稱中的連字元:

  • ash (busybox), csh, tcsh, dash

結論

  • 連字元是非標準的。如果您想要跨外殼兼容性,請遠離它們。
  • 使用下劃線而不是連字元:下劃線在任何地方都可以接受。

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