结肠可以用作标识符吗?

时间:2012-06-28 09:26:51

标签: linux fork colon

我在The Bash command :(){ :|:& };: will spawn processes to kernel death. Can you explain the syntax?中看到了如下代码

user@host$ :(){ :|:& };:

此处冒号用作函数名称的标识符。 冒号可以用作标识符吗?

3 个答案:

答案 0 :(得分:1)

根据the documentation

  

名称

     

单词由字母,数字和下划线组成,以字母或下划线开头。名称用作shell变量和函数名称。也称为标识符。

不,冒号在函数名称中无效。所以要么炸弹在bash中不起作用,要么文档失败。

我很快就认为冒号可能会引用built-in operator,但我不知道它是如何得到预期的语义。

答案 1 :(得分:1)

是的,它可以。

$ :()
> {
> echo "hello from : :)"
> }
$ :
hello from : :)

答案 2 :(得分:0)

实施似乎不一致。您可以定义并调用包含冒号的函数,Google甚至会为其style guide中的包建议。

虽然我注意到你无法导出或取消设置这些功能。

#!/usr/bin/env bash

foo:bar() {
  echo "foo:bar called"
}

foo:bar

export -f foo:bar

unset foo:bar

export不会抱怨,但如果您之后再调用另一个bash脚本,则foo:bar不可用。

未设置甚至会触发错误:

/foo/bar: line 11: unset: `foo:bar': not a valid identifier
$ bash --version
GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)