有几个与 bash 的 fork 炸弹相关的问题:(){ :|: & };:
,但是当我检查答案时,我仍然无法弄清楚当一个函数插入下一个函数时,炸弹的部分到底在做什么,基本上是这个部分::|:
。
到目前为止,我了解到管道符号通过将第一个命令的标准输出连接到第二个命令的标准输入来连接两个命令,例如 echo“土耳其将统治世界”| sed 's/s//'。
但我不明白第一个函数正在通过其标准输出推送什么,该标准输出被推送到第二个函数中,毕竟函数内部没有定义返回值,所以如果人在一开始肚子是空的吗?
答案1
简短的回答:没什么。
如果进程不接受 STDIN 上的任何内容,您仍然可以通过管道连接到它。同样,您仍然可以从在 STDOUT 上不产生任何内容的进程进行管道传输。实际上,您只需将单个 EOF 指示器通过管道传输到第二个进程,该指示器就会被忽略。使用管道的建筑只是“每道工序再开始两道”主题的变体。这个叉子炸弹也可以(有时是)写成:
:(){ :&:; }; :
如果第一个递归调用立即进入后台,则进行第二个调用。
一般来说,是的,管道符号 ( |
) 用于执行您提到的操作 - 将第一个进程的 STDOUT 连接到第二个进程的 STDIN。这也是它在这里所做的,尽管唯一通过该管道的就是单个 EOF 指示器。