LINUX.ORG.RU
ФорумTalks

Бинаризация всея Линукса

 ,


0

0

Копипаста с опеннета:

Раздумывая над способами модернизации командной строки UNIX, Александр Ларсон (Alexander Larsson), активный разработчик GNOME и мантейнер таких проектов, как Nautilus, Gnome-vfs и Dia, предложил в своем блоге новый способ объединения команд с помощью пайпов, основная идея которого заключается в передаче через канал не простых потоков неструктурированных данных, а объектов, представленных в бинарной форме. По словам Александра, его идея может сделать командный интерфейс более гибким, но не таким переусложненным как Microsoft PowerShell.

В качестве основы для представления объектов Александр предложил использовать тип данных GVariants из библиотеки Glib, используемой также в GTK+ и GNOME. Он реализовал несколько утилит, повторяющих функциональность стандартных UNIX-команд ps, sort, head и других, которые принимают на вход и выдают на выходе объекты типа GVariants, причем в случае, если вывод осуществляется в терминал или принимающая команда не поддерживает на входе объекты, данные будут переданы в текстовой форме. Например, вывод его версии ps в терминал будет выглядеть так:

$ dps
   <{'pid': <uint32 1>, 'ppid': <uint32 0>, 'euid': <uint32 0>,  'user': <'root'>,...
   <{'pid': <uint32 2>, 'ppid': <uint32 0>, 'euid': <uint32 0>,  'user': <'root'>,...
   ...

Применив к этому выводу другие утилиты можно легко отсортировать объекты по необходимым полям и выполнить их фильтрацию на основе тех или иных полей:

$ dps | dfilter euid \< 1000 | dsort rss
   <{'pid': <uint32 1>, 'ppid': <uint32 0>, 'euid': <uint32 0>, 'user': <'root'>,
   <{'pid': <uint32 769>, 'ppid': <uint32 745>, 'euid': <uint32 0>, 'user': <'root'>,
   ...

В конце концов, можно использовать специальные утилиты для вывода данных удобочитаемом виде:

dps | dfilter euid \< 1000 | dsort rss | dhead 4 | dtable pid user rss vsize cmdline
   pid     user      rss    vsize  cmdline
     1   'root'    24408    61488 '/usr/lib/systemd/systemd'
   769   'root'    16028   108000 '/usr/bin/Xorg :0 -background none -logverbose 7 -seat seat0 -nolisten tcp vt1'
   608   'root'    15076   255312 '/usr/bin/python /usr/sbin/firewalld --nofork'
   747   'root'     8276   452604 '/usr/sbin/libvirtd'

Как говорит Александр, такой подход существенно расширяет возможности обработки данных, позволяя, например, применять к выводу типо-зависимые операции (сравнение euid с числом), выполнять правильное обрезание списка (без учета заголовка), работать одновременно со всеми полями объекта даже в том случае, если они не будут выведены на экран. Кроме того, все данные между командами передаются в бинарной форме, благодаря чему их обработка существенно упрощается.

Ответ на: комментарий от grondek

Вы тут полсистемы переделать собираетесь?

Если проводить эксперименты с чем-то новым, то надо делать это не стесняясь, иначе можно погрязнуть в дебрях поддержки legacy.

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

Если Линукс весь, включая генту, покроется этой коростой, я лучше перейду на Мак.

Мак идёт лесом! БСД. Ну, если не закопают. OpenBSD точно будет жить в том или ином виде. Если и их похерят - отладчик, дизасемблер и на винду.

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

Если проводить эксперименты с чем-то новым, то надо делать это не стесняясь

Спасибо, один уже не постеснялся. У него явно недостаток белка в организме.

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

шелл в свою очередь увидев внутреннее представление посылаемое на экран берет модель представления определенную для этой команды

модель представления определенную для этой команды

То есть шелл становится мегакомбайном, знающим обо всех командах?

grondek
()
Ответ на: комментарий от argin

А в «моём» линуксе (полу-самосборный embedded если что), вышеуказанные утилиты ложатся просто отлично и местами сильно упростят жизнь. Как впрочем и systemd, который я планирую попробовать при следующем серьёзном рефакторинге прошивки. Потому что это гораздо удобнее чем поиск pid грепом(не все демоны отдают PID или умеют создавать pid-file) или построение вагона вызовов awk/sed/... для получения какого-нибудь числа из текстового вывода софта, который предполагалось читать только человеку, а никак не скрипту.

Так что, линукс одинаков для всех не будет.

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

То есть шелл становится мегакомбайном, знающим обо всех командах?

В худшей реализации - да. В нормальной - команда также может хранить в каком нибудь xml файле модель представления.

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

Вы тут полсистемы переделать собираетесь?

В данном подтреде — только синтаксис шелла для работы с несколькими потоками ввода/вывода. /dev/tcp точно так же не существует в системе, но в баше (и совместимых шеллах, т.е. ksh, zsh) он — реальность.

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

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

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

Это решаемо отдельным шеллом. Команда шлет внутреннее представление, а шелл в свою очередь увидев внутреннее представление посылаемое на экран берет модель представления определенную для этой команды, и рисует в соответствии с ним.

Это решаемо отдельной осью :) и мне кажется Вы знаете её название..

команды шлют объекты, объекты принадлежат классам, по мере необходимости сериализауется в xml и транслируется xslt в зависимости от контекста. Пайпы квитирующие и умеют атомарно передавать блоки. Ах,да ! Всё это щастие по отдельности и вместе регистрируется в реестре :)

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

1. Ты можешь написать в рассылку linux-разработчиков.

2. Шансы, что они послушают тебя и изменят формат (да и просто изменят формат) малы, так как поломанная твоя софтина - это будет сущий пустяк, по сравнению с тем, что сделается с системным ПО.

3. Читать о парсинге всё-равно придется, чтобы узнать о получаемых значениях, их формате, и в каких случаях ты можешь получить что-то одно, а в каких - другое. И непосредственно разделитель здесь - одна из наименьших проблем.

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

Утилита не имеет возможности разобраться для кого она шлёт через пайп данные.

При создании пайпа открываем обратный пайп, по заранее обговорённому стандарту. Если кто-то не хочет открывать его — он не умеет в unixway 2.0, говорим с ним текстом.

По этому же второму пайпу, кстати, можно реализовать методы (тот же toString() для этих ваших tee).

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

Уже есть в gstreamer. man gst-launch:
что-то типа этого:

gst-launch filesrc location=./file.avi ! avidemux name=v v.video_00 ! msvdhddec ! mvdusink v.audio_00 ! mad ! alsasink

AiFiLTr0 ★★★★★
()

Почитал комментарии. Вопрос к Kindly_Cat: если ты программист или админ - каков объем твоего кода, который тебе придется переписывать, если сабжевое нововведение внезапно внедрят прямо завтра? Если же ты обычный школьник, то чего ты так раскудахтался?

power
()

строго говоря, это переизобретение COM.

т.е. в коме можно как раз назвать объект, и использовать его где-то еще по имени.

ckotinko ☆☆☆
()
Ответ на: комментарий от tailgunner

Придумалось такое:

1. Вводим новую операцию для использования в списках команд. c1 @@ c2 — в фоне запускается c1, следом запускается c2; после завершения c2, c1 убивается, если она сама не умерла к тому времени.

2. Вводим синтаксис для автоматического создания именованных пайпов и их подстановки в аргументы команды: >@имя и <@имя. Именованный пайп создаётся автоматически при первой встрече @имя при анализе команды и удаляется после окончания выполнения списка команд, в котором он встретился.

3. Пример использования:

command1 --output1 >@channel1 --output2 >@channel2 --output2 >@channel2 @@ \
command2 <@channel1 <@channel2 > >@channel4 @@ \
command3 <@channel3 <@channel4

Как это работает:

  • Создаётся 3 именованных пайпа.
  • Они подставляются в аргументы command1.
  • Запускается command1.
  • Создаётся 4-й пайп.
  • Для запуска command2, её stdout перенаправдляется в 4-й пайп.
  • В аргументы command2 подставляются пайпы 1 и 2.
  • Запускается command2.
  • В аргументы command3 подставляются пайпы 3 и 4.
  • Запускается command3.
  • Ждем пока отработает command3.
  • Удаляем пайпы.
geekless ★★
()
Ответ на: комментарий от Kindly_Cat

БСД

В гробу я его видел.

Ну, да.

Мак

Это почти настоящий Юникс, вообще-то.

А БСД? Это что? А чем они «от друг-друга» отличаются? Ну, в плане «Ъ»

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

А вот еще вариант

Это позиционный параметр - вполне можно и просто

(ps thunderbird).id

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

строго говоря, это переизобретение COM.

т.е. в коме можно как раз назвать объект, и использовать его где-то еще по имени.

Не совсем. Переизобретением COM-а будет хорошая годная компонентная модель поверх Dbus. (При этих словах в тред должны набежать куча красноглазых фанатиков, не способных понять, что даже COM гораздо ближе к юниксвею, чем современное состояние линуксовых DE.)

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

А как будет выглядеть вариант с регуляркой матчащей команду, запустившей процесс?

ps th*rd
ps|where {$_.Name -match "регулярка"};
Orlangoor ★★★★★
()
Ответ на: комментарий от Kindly_Cat

glib к иксам отношения не имеет, в общем-то: тот же mc к нему привязан
да и оно не такое уже и большое, так что проблема это, наверное, только для экстремального embedded

вариантом было бы выделить gvariants в какую-нибудь библиотеку полегче

Deleted
()
Ответ на: комментарий от RA

PS $temp=Get-Process -Name powershell
PS $temp.id

это получение PID текущего процесса?

да,

pid=$$

но не суть,

Приводи примеры, отражающие суть.

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

Дело не в том большое оно или нет. Просто эти идиоты мешают в кучу мух и мясо. Даже Поттеринг не додумался привязать systemd к glib или gtk. Этак дойдёт до того, что скоро какой-нибудь dbus привяжут к GTK или Qt.

«Ну GTK же немного весит, ВАМ ЧТО МЕСТА НА ДИСКЕ ЖАЛКО?!!»

Kindly_Cat
() автор топика
Ответ на: комментарий от geekless

что даже COM гораздо ближе к юниксвею, чем современное состояние линуксовых DE

COM это убер объектная модель с возможностью удаленных вызовов. Требующая немерянного количества кода для реализации простейших интерфейсов.

gobject + dbus гораздо проще и прозрачнее, а функционал очень близок.

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

Просто ради любопытства. '.Name' это команда или всё-таки название бинаря.

Да, ты прав - название, я невнимательно прочитал. Класс Process просто не предоставляет такого свойства.

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

ВАМ ЧТО МЕСТА НА ДИСКЕ ЖАЛКО?!!

Жалко. Когда всего 8 мегабайт на всё - ядро, загрузчик, rootfs и прочие rwfs для пользовательских приблуд, каждый килобайт экономишь.

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

Вот-вот, powershell просто не готов, если для частых операций мне нужно писать программу — это плохой, негодный шелл.

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

ты не дочитал это

суть в том что возвращает тип(int) и как легко получить данные без awk sed hell

PS kill (ps thunderbird).id

RA
()
Ответ на: комментарий от Orlangoor

Да, ты прав - название, я невнимательно прочитал. Класс Process просто не предоставляет такого свойства.

Но тем не менее это тоже вполне решаемо. Добавим нужное свойство сами - http://mohundro.com/blog/2010/02/05/quickly-get-the-command-line-arguments-fr...

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

[sarcasm]
Ты что, против инноваций? Ты ваще кто такой, ты сколько денег разработчикам заплатил, холоп?
[/sarcasm]

Kindly_Cat
() автор топика
Ответ на: комментарий от RA

kill (ps thunderbird).id

Фу, а если процессов несколько, а нахрена командлет?!

ps thunderbird | %{ $_.Kill()}

Orlangoor ★★★★★
()

Было бы неплохо, если бы стандартные утилиты срали в пайп или объекты, или тупо поля (типа parted -m), а в терминал — человеческий читаемый выхлоп. Это было бы неплохо. Похожий на powershell функционал скорее всего не нужен, т.к. для сложных вещей уже есть питон.

А вообще, лучше бы единый апи к ОС родили

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

ты не дочитал это

суть в том что возвращает тип(int) и как легко получить данные без awk sed hell

Я дочитал и получил PID без awk sed hell. Суть выгоды «типа int» в твоем посте не раскрыта.

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

COM это убер объектная модель с возможностью удаленных вызовов. Требующая немерянного количества кода для реализации простейших интерфейсов.

Ну крестовые костыли нам не нужны. :}

gobject + dbus гораздо проще и прозрачнее, а функционал очень близок.

И ими никто не пользуется. Так что я не прав — задача скорее не придумать оьбъектную модель, а пинками заставить её использовать.

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

утилита - любая, это не проблема. Я гентушник, ставлю то, что мне нужно.

вопрос в том, что решение, удобное в частных случаях хотят сделать универсальным, т.е менять дизайн системы.

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