Страница 1 из 1

Выполнение команд аля командная строка

СообщениеДобавлено: 29.05.2011 05:35:55
Дож
В Free Pascal нет полноценного выполнения команд наподобие командной строки. Разработчики для кроссплатформенности и универсальности рекомендуют использовать TProcess, однако, с ним нужно вручную ловить ввод и вывод программ и перенаправлять куда-то.

Часто хочется вызывать из программ что-то сложное, вида «first a b c | sercond e d f 2>&3 > out || echo error». Поэтому я хочу написать исполнялку таких штук, обёртку над TProcess.

Многие из вас линуксоиды, и, надеюсь, что кто-нибудь объяснит мне некоторые особенности использования командной строки. Я планирую реализовать такой алгоритм разбора (подпрограмма получает на вход строку с командой):
1) Выделяем в строке цитаты (заключённые в двойные кавычки), их в дальнейшем не трогаем, а передаём в виде параметров на последнем шаге в первозданном виде. Всю строку, в которой некоторые части помечены как цитаты, назовём списком.
2) Выделяем в списке закорачивающие операторы — && и ||. Бъём ими строку на части, которые назовём асинхронными списками, их последовательно условно выполняем.
3) Каждый асинхронный список бъём оператором «&» на части, которые назовём конвейром. Все конвейеры выполняются параллельно и в качестве числа-результата для условия выполнения следующего списка мы берём результат первого конвейера (проверьте правильно ли!).
4) В конвейере выделяем самые правые операторы вида
[n]> xxx
[n]>> xxx
[n]< xxx
[n1]<&n2
[n1]>&n2
То, что осталось, разбиваем на части символом |, части будут являться простейшими командами, которые уже можно напрямую выполнить при помощи TProcess, и последовательно передавать их выводы на входы.

Правильно ли я понимаю последовательность разбора? Ничего важного и частоиспользуемого не забыл? Интересно также, в чём различие [n1]<&n2 и [n1]>&n2?

Re: Выполнение команд аля командная строка

СообщениеДобавлено: 29.05.2011 10:45:33
Vadim
Дож
Дож писал(а):Правильно ли я понимаю последовательность разбора?

Наверное правильно. :) Только зачем нужен разбор? По-моему, так и нафиг он для Вашей задачи не нужен.

Re: Выполнение команд аля командная строка

СообщениеДобавлено: 29.05.2011 11:49:48
Padre_Mortius
Дож, то, что вы пытаетесь написать уже давным давно написано и оформлено в виде компонента. Называется он CmdLine и используется в DoubleCommander

Re: Выполнение команд аля командная строка

СообщениеДобавлено: 29.05.2011 16:19:39
Дож
Только зачем нужен разбор? По-моему, так и нафиг он для Вашей задачи не нужен.

И как же без него обойтись? Хочется универсальный механизм, на будущее, а TProcess такого не позволяет.

Дож, то, что вы пытаетесь написать уже давным давно написано и оформлено в виде компонента. Называется он CmdLine и используется в DoubleCommander

Я и так скрипя зубами решил, что придётся использовать целый класс TProcess, вместо просто функций, а тут ещё и часть LCL потащится. Хочется всего по минимуму, планирую писать простенькие консольные программы.

[offtop]Я даже инструкцию по установке затрудняюсь выполнить: «Open cmdline.lpk», всю жизнь использую fpc из-под консоли.[/offtop]

Re: Выполнение команд аля командная строка

СообщениеДобавлено: 29.05.2011 16:26:59
Padre_Mortius
Дож, не хотите использовать готовое и не нужно, но идеи и реализацию можно подсмотреть.

Re: Выполнение команд аля командная строка

СообщениеДобавлено: 29.05.2011 21:58:23
v-t-l
Нафиг нужен разбор? Скармливаете всю строку командному интерпретатору (под виндой - cmd.exe, под никсами sh или bash) и все.