ico*_*ast 35 shell bash ksh zsh csh
在我的测试中(在 Bash 和 Z Shell 中),我发现定义函数或别名或名称中带有连字符的可执行 shell 脚本没有任何问题,但我不确定这在所有 shell 和所有用例中都没有问题.
我想这样做的原因是连字符比下划线更容易输入,因此更快更流畅。
我不愿相信这不是问题的一个原因是,在某些语言(例如 Ruby)中,即使没有空格,连字符也会被解释为减号。如果在某些 shell 中可能发生这样的事情,我不会感到惊讶,即使没有空格,连字符也被解释为表示选项。
我有点怀疑的另一个原因是我的文本编辑器搞砸了带有连字符的函数的语法突出显示。(当然,这完全有可能只是 shell 脚本的语法高亮配置中的一个错误。)
有什么理由避免使用连字符吗?
Joh*_*024 48
根据 POSIX 标准,函数名称必须是有效名称,名称可以包括:
3.231 名称
在shell 命令语言中,一个仅由可移植字符集中的下划线、数字和字母组成的词。名称的第一个字符不是数字。
3.10 别名
在shell 命令语言中,一个仅由可移植字符集中的下划线、数字和字母以及以下任何字符组成的单词:'!'、'%'、','、'@'。实现可能允许别名中的其他字符作为扩展名。 (强调我的。)
在任何一种情况下都必须允许的字符中未列出连字符。因此,如果使用它们,则无法保证可移植性。
dash
是/bin/sh
debian-ubuntu 系列上的默认 shell ( ),它不支持函数名称中的连字符:
$ a-b() { date; }
dash: 1: Syntax error: Bad function name
Run Code Online (Sandbox Code Playgroud)
有趣的是,它确实支持别名中的连字符,但如上所述,这是一个实现特性,而不是一个要求:
$ a_b() { printf "hello %s\n" "$1"; }
$ alias a-b='a_b'
$ a-b world
hello world
Run Code Online (Sandbox Code Playgroud)
busybox shell(Almquist shell)也不支持函数名称中的连字符:
$ a-b() { date; }
-sh: Syntax error: Bad function name
Run Code Online (Sandbox Code Playgroud)
已知以下 shell 支持函数名称中的连字符:
已知以下 shell不支持函数名称中的连字符: