Як ksh93 уникає вилок при заміні команд


12

Дано

cmd='fun(){ echo "$@";  }; fun $(fun $(fun hi))'

снарядів, як правило, потрібно зробити 2 виделки, щоб це сталося

strace-f(){ strace -f "$@" 2>&1; }; 
for sh in dash bash zsh ksh; do 
    printf "$sh\t" ; strace-f $sh -c "$cmd"  |grep -e clone -e fork -c;
done

за винятком того, що kshгероїчно робить це, не розпираючи жодного разу:

dash    2
bash    2
zsh     2
ksh     0

Як це робити?


Редагувати:

Ось як воно йде вниз із закинутою трубою:

cmd='fun(){ echo "$@"| echo "$@";  }; fun $(fun $(fun hi))'

Вихід:

dash    11
bash    10
zsh     5
ksh     3 

Це не вдається, не вдається управляти цим для цілих трубопроводів. Я хотів би зробити це можливим для цілих трубопроводів, ймовірно, донести його до інших оболонок.
PSkocik

3
Тільки для перевірки здоровості, ви kshвстановили? Коли я запускаю ваш код, я отримую 0будь-яку оболонку, яку я не встановив
Ерік Ренуф

1
@EricRenouf Лол, так, я. І це теж робить речі. ;)
PSkocik

Відповідачі, можливо, захочуть прочитати stackoverflow.com/questions/14686872 .
JdeBP

Відповіді:


13

Ksh93 робить багато, щоб уникнути вил. Я поняття не маю, як він знає, як обробити перший випадок, оскільки це trussпоказує, що він викликає лише один write(2)дзвінок з кінцевим результатом.

Можливо, Девід сканує команду в macro.c і знає, що він може обробляти "відлуння" всередині.

Що я можу сказати, це те, що я минулого року переписав аналізатор та перекладач "Борнської оболонки" і в основному зменшив кількість вилок і замінив багато вилок на vfork()дзвінки. Це в даний час робить оболонку Борна другою найшвидшою оболонкою минулого ksh93. Ви можете також запустити свої тести bosh.

BTW: ksh93 взагалі уникає вил. Він реалізує структуру, яка містить усі попередні глобальні змінні, і це зробило код оболонки повторним, якщо він викликається з різними екземплярами "глобальної" вказівника змінної структури.

Цей метод використовується ksh93 всякий раз, коли є піддіаграма (cmd).

Причиною цього переписування є те, що Девід використовує Win-DOS на своєму ноутбуці, і він не любив повільний Cygwin, тому він написав UWIN і використовує ksh93 безпосередньо на Win-DOS. Оскільки fork()у Win-DOS немає, йому потрібно було знайти нове рішення ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.