Что именно функция передает в другую функцию в этой форк-бомбе :(){ :|: & };:?

Что именно функция передает в другую функцию в этой форк-бомбе :(){ :|: & };:?

Есть пара вопросов, связанных с форк-бомбой для bash :(){ :|: & };:, но когда я проверил ответы, я все еще не мог понять, что именно делает часть бомбы, когда одна функция переходит в другую, по сути, эта часть: :|:.

Насколько я понимаю, символ трубы соединяет две команды, соединяя стандартный вывод первой со стандартным вводом второй, например, echo "Turkeys will dominate the world" | sed 's/s//'.

Но я не понимаю, что первая функция проталкивает через свой стандартный вывод, который проталкивается во вторую, в конце концов, внутри функции не определены возвращаемые значения, так что же движется через человеческую многоножку, если у человека в начале пустой желудок?

решение1

Короткий ответ: ничего.

Если процесс ничего не принимает на STDIN, вы все равно можете передать его по конвейеру. Аналогично, вы все равно можете передать по конвейеру из процесса, который ничего не выводит на STDOUT. Фактически, вы просто передаете один индикатор EOF во второй процесс, который просто игнорируется. Конструкция с использованием конвейера — это просто вариация на тему «каждый процесс запускает еще два». Эта форк-бомба также может быть (и иногда так и делается) записана как:

:(){ :&:; }; :

Если первый рекурсивный вызов немедленно выполняется в фоновом режиме, то выполняется второй вызов.

В общем, да, символ трубы ( |) используется для того, чтобы делать именно то, что вы упомянули - подключать STDOUT первого процесса к STDIN второго процесса. Это также то, что он делает здесь, хотя единственное, что когда-либо проходит через эту трубу - это единственный индикатор EOF.

Связанный контент