0

我在The Bash command :(){ :|:& };中看到了一段代码:将产生进程导致内核死亡。你能解释一下语法吗?如下

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

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

4

3 回答 3

1

根据文档

姓名

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

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

我很快想到冒号可能指的是内置的 operator,但我不明白它如何获得预期的语义。

于 2012-06-28T09:35:41.183 回答
1

是的,它可以。

$ :()
> {
> echo "hello from : :)"
> }
$ :
hello from : :)
于 2012-06-28T09:35:45.743 回答
0

执行似乎不一致。您可以定义和调用包含冒号的函数,Google 甚至在其样式指南中为包建议了这一点。

尽管我注意到您无法导出或取消设置这些功能。

#!/usr/bin/env bash

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

foo:bar

export -f foo:bar

unset foo:bar

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

unset 甚至会触发错误:

/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)
于 2017-06-19T15:45:59.167 回答