В 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?
Выполнение команд аля командная строка
Модератор: Модераторы
Дож
Наверное правильно.
Только зачем нужен разбор? По-моему, так и нафиг он для Вашей задачи не нужен.
Дож писал(а):Правильно ли я понимаю последовательность разбора?
Наверное правильно.
-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
Дож, то, что вы пытаетесь написать уже давным давно написано и оформлено в виде компонента. Называется он CmdLine и используется в DoubleCommander
Только зачем нужен разбор? По-моему, так и нафиг он для Вашей задачи не нужен.
И как же без него обойтись? Хочется универсальный механизм, на будущее, а TProcess такого не позволяет.
Дож, то, что вы пытаетесь написать уже давным давно написано и оформлено в виде компонента. Называется он CmdLine и используется в DoubleCommander
Я и так скрипя зубами решил, что придётся использовать целый класс TProcess, вместо просто функций, а тут ещё и часть LCL потащится. Хочется всего по минимуму, планирую писать простенькие консольные программы.
[offtop]Я даже инструкцию по установке затрудняюсь выполнить: «Open cmdline.lpk», всю жизнь использую fpc из-под консоли.[/offtop]
-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
Дож, не хотите использовать готовое и не нужно, но идеи и реализацию можно подсмотреть.
Нафиг нужен разбор? Скармливаете всю строку командному интерпретатору (под виндой - cmd.exe, под никсами sh или bash) и все.
