предположит, у меня есть строка, как следующийАнализировать оболочку строки в кавычках в execv совместимого вектор аргумента
echo "foo" "bar\"blub""baz" "'" "\"" foo\ bar "\\" '\'' """" Lots" "of\ whitespace
Теперь я хочу, чтобы выполнить над строкой в качестве команды, как если бы она была напечатана в оболочку через вызов Unix.execv
, Если бы я не сделал ни одной ошибки, то оболочка будет разбирать выше в следующем OCAML списке:
["echo"; "foo"; "bar\"blubbaz"; "'"; "\""; "foo bar"; "\\"; "'", "", "Lots of whitespace"]
Какая библиотека получает меня из исходной строки в анализируемом списке?
В конечном счете, я хочу передать полученный список Unix.execvpe
. Существует также Unix.open_process_full
, который способен обрабатывать мою исходную строку, используя /bin/sh
, но я обнаружил, что мое приложение на 16% быстрее при вызове внешней программы напрямую без /bin/sh
. Теперь я хочу иметь возможность принимать больше входных строк, включая цитирование и экранирование.
Нужно ли мне рулон мой собственный парсер?
Там существует функция POSIX wordexp
но оборачивать эту функцию не решить мою проблему, потому что wordexp
делает больше, чем то, что я хочу (подстановка команд, оценивает шарики, заменяет Тильда и переменные окружения).
Я только хочу, чтобы кавычки и экраны были разрешены.
Я не знаю стандарта (как в стандарте «POSIX или ...»), который выполняет задание, которое вы хотите. Это означает, что вы, вероятно, закончите свой собственный или копаете код одного или нескольких оболочек и т. Д. –
Почему именно вы хотите разделить слова, похожие на, но не совсем как на оболочку? Как вы решаете, какие синтаксические функции вы хотите поддерживать, а какие - нет? Почему 'sh', а не лучший формат цитирования? –
@thatotherguy вход поступает из файла конфигурации, который хранит строку, которая должна быть выполнена в переменной. Эта строка не должна содержать подстановочные знаки, переменные среды или тильда. Если я использую 'wordexp', то я не могу сказать, чтобы он выдавал ошибку или иным образом отказывался анализировать строки, которые содержат эти вещи. Вы спрашиваете, почему не лучший формат цитирования, чем оболочка POSIX? – josch