Выполнение команд аля командная строка
Добавлено: 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?
Часто хочется вызывать из программ что-то сложное, вида «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?