我在The Bash command :(){ :|:& };中看到了一段代码:将产生进程导致内核死亡。你能解释一下语法吗?如下
user@host$ :(){ :|:& };:
这里冒号用作函数名称的标识符。冒号可以用作标识符吗?
我在The Bash command :(){ :|:& };中看到了一段代码:将产生进程导致内核死亡。你能解释一下语法吗?如下
user@host$ :(){ :|:& };:
这里冒号用作函数名称的标识符。冒号可以用作标识符吗?
根据文档:
姓名
仅由字母、数字和下划线组成并以字母或下划线开头的单词。名称用作 shell 变量和函数名称。也称为标识符。
不,冒号在函数名中无效。因此,要么炸弹在 bash 中不起作用,要么文档失败。
我很快想到冒号可能指的是内置的 operator,但我不明白它如何获得预期的语义。
是的,它可以。
$ :()
> {
> echo "hello from : :)"
> }
$ :
hello from : :)
执行似乎不一致。您可以定义和调用包含冒号的函数,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)