是否可以在 bash 脚本中使用“@”符号作为函数名称?以下不起作用:
function @() {
echo hello
}
答案1
从man bash
name A word consisting only of alphanumeric characters and underscores,
and beginning with an alphabetic character or an underscore. Also
referred to as an identifier.
Shell functions are declared as follows:
name () compound-command [redirection]
function name [()] compound-command [redirection]
答案2
编辑2:虽然@
在 vanilla bash 中没有问题,但当extglob shell 选项设置完毕后,简单的echo @()
就可以在一定条件下挂起你的shell了。更有理由不用@
作标识符`。
编辑1:澄清一下,根据标识符的定义,这是不允许的。我不推荐它。我只是说为了向后兼容,它是可能的在 bash 中用作@
标识符。
@() { echo "$1 world"; }
@ hello
alias @="echo hello"
@ world
@
用作特殊参数 ( $@
) 和数组 ( ${arr[@]}
),但不用于其他地方。 Bash 不会阻止您将它用于别名和函数等标识符,但不会阻止变量名。
有些人使用别名@
为sudo
,因此他们可以执行命令为@ apt-get install
。
我不会用作 shell 标识符的主要原因@
是我太习惯了@
Makefile 中的语义它使命令静音而没有任何副作用。
顺便说一句:在 zsh 中的工作原理相同。
答案3
函数的命名与别名允许的字符非常相似:
From man bash
:
字符 /、$、` 和 = 以及上面列出的任何 shell 元字符或引用字符不得出现在别名中。
元字符
以下之一: | &; ( ) < > 空格制表符
所以,除了: / $ ` = | &; ( ) < > 空格制表符
任何其他字符对于别名和函数名都应该有效。
但是,当 extglob 处于活动状态时,@
也会使用该字符。@(pattern-list)
默认情况下,extglob 在交互式 shell 中处于活动状态。
所以,这应该会失败:
$ @(){ echo "hello"; }
bash: syntax error near unexpected token `}'
然而,这有效:
$ bash -c '@(){ echo "hello"; }; @'
hello
这也应该有效:
$ shopt -u extglob ### keep this as an independent line.
$ @(){ echo "hello"; }
$ @
hello
也可以这样做:
$ f(){ echo "yes"; }
$ alias @=f
$ @
yes
别名在接受的符号方面是灵活的。