论坛首页 综合技术论坛

:() { :|:& }; :

浏览 1800 次
锁定老帖子 主题::() { :|:& }; :
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (2)
作者 正文
   发表时间:2009-04-02   最后修改:2009-07-23

 

gembler@best-ubuntu:~$ :() { :|:& }; :
gembler@best-ubuntu:~$ echo '十人|日一|十十o' | sed 's/.../&\n/g'
 

哈哈,这两行... ...

 

  • :() { :|:& }; :

:() -> 这里是一个函数签名,在非posix标准下的bash,用冒号作为函数名是合法的,因为是先函数名再内置命令。

 

 ':' 冒号,也是一个命令,是空,啥都不干,有时候可以当注释用,哈哈:

gembler@best-ubuntu:~$ : gembler, are you insane?
 

而且是返回0,也就是true,有时候死循环能用上:

gembler@best-ubuntu:~$ :
gembler@best-ubuntu:~$ echo $?
0
gembler@best-ubuntu:~$ while :; do echo gembler; done

 

 发现我唠叨了... ...回正题:

gembler@best-ubuntu:~$ :() { echo gembler; }    #bash默认非posix标准的
gembler@best-ubuntu:~$ :
gembler
gembler@best-ubuntu:~$ set -o posix    #开启posix标准,当然,也能用“+o”把它禁掉
gembler@best-ubuntu:~$ :() { echo gembler; }    #马上就......
bash: “:”: 无效的标识符

 

 把 ':' 冒号换成 foo ,弄个清晰点的结构:

foo() {    #这下够清晰了吧
    foo|foo&
};
foo

 

其实它是递归创建后台进程,直到... ...

 

如果省去了管道(pipe):

foo() {
    foo
};
foo

只会挤满栈(stack),影响该进程,所以好一点的机器,基本无视。

是但,加上管道(pipe),那就... ...挤满进程列表,这个有点恐怖,循环递归地进程创建进程 - 囧

 

普通用户是可以跑这命令的,为了避免悲剧的发生,所以限制一下 user 的 noproc 较好,我只想到这方案,有什么其他方案,麻烦吼一下 :)

  • echo '十人|日一|十十o' | sed 's/.../&\n/g'

这个... ...输出结果是:

 

gembler@best-ubuntu:~$ $ echo '十人|日一|十十o' | sed 's/.../&\n/g'    #幹! ---- 哈哈
十人|
日一|
十十o

 

's/.../&\n/g':

 

    举个例子, 's/best/gembler/g' ,是表示将 best 替换为 gembler ,在不加 'g' 的情况下,在一行里只处理第一个匹配,然后就跳到下一行,同行后面即使有匹配的,它也不管,所以加上 'g' ,是应该的。

 

    原命令从表面上来看是将 '...' 替换为 '&\n' ,但是 '...' 是表示每匹配三个字符, '&' 是匹配项的占位符, '\n' 就这是换行符了,所以输出是每三个字符就换一行。“幹! ” ---- 哈哈

论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics