LINUX.ORG.RU

bash, запись в переменную без подпроцесса

 ,


0

2

Привет!

Как в bash или zsh записать выхлоп встроенной команды в переменную без форка оболочки?

A=$(builtin type ps)   #форкается
builtin type ps|read A #тоже
A=`builtin type ps`    #тоже
builtin type ps>/tmp/1;read A</tmp/1; #не форкается, но костыль

Проверить количество форков можно так:

pid(){ date>/dev/null& echo $!; };S=$(pid);for i in {1..100}; do КОД;done;E=$(pid);echo $((E-S))

Откуда вы лезете?

anonymous ()
Ответ на: комментарий от DELIRIUM

Есть у меня штука для дебага, которую периодически запускаю, показывает в том числе форкание процессов. И есть плагин для подсветки в zsh, который часто вызывает это на каждый введёный символ. Хотелось бы это развидеть без grep -v.

Ну и по общим соображениям, зачем нужен fork, если можно его избежать

disarmer ★★★ ()

А никак, причём cущественно никак.

В ядре шелла вывод наверняка не абстрагируется, т. е. любой шелловый builtin умеет выводить только в fd. Соответственно, единственная возможность — это выводить либо в временный файл, либо в временный pipe, а потом из него читать. В pipe нельзя, потому что тогда тебе придётся открыть оба конца pipe'а одним процессом, но шелл однопоточный, а размер буфера pipe тебе заранее не известен (могут быть дедлоки). А в файл ты не хочешь.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Печально. Я сделал через файл в /tmp и это помогло, но думал что есть изящнее решение

disarmer ★★★ ()
Ответ на: комментарий от router

Мне это мешает конкретно в плагине zsh, переписывать весь zsh на perl я сегодня не хочу, а вызывать perl изнутри - это тоже форк.

Я собственно надеялся что в {ba,z}sh есть неизвестный мне аналог этого:

open(STDOUT, ">", \$variable)

disarmer ★★★ ()
Ответ на: комментарий от zolden

Есть у меня штука для дебага, которую периодически запускаю, показывает в том числе форкание процессов.

detector|grep -v zsh

Она из какого-то там интерфейса ядра улавливает fork/exec/exit и выводит в терминал, соответственно можно отфильтровать

disarmer ★★★ ()
Ответ на: комментарий от disarmer

Сделай хардкод в куске обработки, раз количество «не твоих» форков известно заранее
Типа «echo $((E-S-1))»

zolden ★★★★★ ()
Ответ на: комментарий от zolden

Не, это я просто привёл кусок кода, который позволяет проверить форкается ли код.

Я могу просто не показывать форки в той утилите (предыдущий пример с grep -v, нежелательно) или избежать форков (костыль с файлом). Второй вариант нормально работает, думал есть какой-то аналог получше, без записи в файл

disarmer ★★★ ()
Ответ на: комментарий от disarmer

и по общим соображениям, зачем нужен fork, если можно его избежать

Тогда вообще не пиши на shell, раз такие требования.

Deleted ()
Последнее исправление: romeo250501 (всего исправлений: 1)
Ответ на: комментарий от Deleted
% grep perl ~/.profile -c
103

Стараюсь, но в плагине для zsh выбора на чём писать нет

disarmer ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.