使用“@”作为 bash 函数名称

使用“@”作为 bash 函数名称

是否可以在 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

别名在接受的符号方面是灵活的。

相关内容