Что да $ (да да) делает?


23

Задумываясь о том, что yesможет быть команда, я наткнулся на этот комментарий , и попытался выполнить

yes $(yes yes)

Из того, что я понимаю, это должно просто напечатать бесконечную последовательность yes, но вместо этого он ничего не выводит и через несколько секунд вылетает мой графический терминал. (Если я выполню его на tty1, через некоторое время появится приглашение для входа.)

Что здесь происходит?


2
Я не эксперт, но может случиться так, что первый вызов пытается печатать бесконечность бесконечное количество раз. (или аргумент может быть просто слишком длинным.)
Strugee

5
@strugee Список аргументов никогда не заполняется, потому что yesникогда не возвращается.
Крис Даун

@strugee Вы можете получить «бесконечность бесконечности времени», используя xargs: yes yes | xargs -P 0 yes(или без -P 0для бесконечности одного процесса)
Кайл Стрэнд

Ответы:


25

Уже должно быть достаточно для запуска

 echo $(yes yes)

$(...)Запускает внутреннюю команду , пока она не будет закончена , и захватывает всю свою продукцию. - Теперь, когда он yesработает долго и генерирует много выходных данных, bash в конечном итоге исчерпает память и вылетает.


6

Чтобы увидеть сообщение об ошибке, которая закрывает вашу оболочку, вам нужно запустить вложенную оболочку.

$ sh
$ kill -9 $$
Killed
$

$ sh
$ yes $(yes yes)
sh: xrealloc: cannot allocate 18446744071562067968 bytes
$

1
16 миллионов гигабайт, а? Гордон Мур скрывается в углу идет, «Ну ... Я имею в виду, не совсем еще ...»
FERD
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.