Учитывая имя файла, я хочу написать сценарий оболочки, который выдает следующее и направляет его в процесс:
Content-Length:<LEN><CR><LF>
<CR><LF>
{ "jsonrpc":"2.0", "params":{ "text":"<ESCAPED-TEXT>" } }
где <ESCAPED-TEXT>
— это содержимое файла, но его CR, LF и кавычки были экранированы как \r
, \n
и \"
(и я предполагаю, что все остальные экраны JSON в конечном итоге также понадобятся), и где <LEN>
— это длина окончательного JSON. строка, содержащая экранированный текст.
Вот мое текущее решение для bash-скрипта. Это работает, но уродливо, как черт.
(
TXT=`cat ~/a.py | sed -E -e :a -e '$!N; s/\n/\\\n/g; ta' | sed 's/"/\\\"/g'`
CMD='{"jsonrpc":"2.0", "params":{ "text":{"'${TXT}'"}} }'
printf "Content-Length: ${#CMD}\r\n\r\n"
echo -n "${CMD}"
) | pyls
Кто-нибудь может подсказать, как сделать этот очиститель, пожалуйста?
Этот сценарий sed заменяет только LF, а не CR. Он накапливает каждую строку в буфере, а затем выполняет
s//g
для замены всех LF в нем. Я не мог придумать ничего более чистого, что работало бы как на Linux, так и на OSX/BSD.Я использовал и printf, и эхо. Сначала printf, потому что я действительно хочу выдать CRLFCRLF после заголовка Content-Length, и вам, по-видимому, нужно printf для этого, потому что поведение echo с escape-последовательностями неодинаково во всех платформы. Следующее echo, потому что я не хочу, чтобы литералы
\r
и\n
внутри TXT не экранировались, что сделало бы printf.
Контекст: существует стандарт под названием «Language Server Protocol». В основном вы запускаете что-то вроде pyls
, которое я запускаю здесь, и вы передаете JsonRPC к нему через стандартный ввод, и он передает обратно вещи. У разных людей есть написанные языковые серверы для Python (пилы, которые я использую здесь), и C#, и C++, и Typescript, и PHP, и OCaml, и Go, и Java, и каждый человек склонен писать свой языковой сервер по-своему. родной язык.
Я хочу написать тестовую обвязку, которая может отправлять несколько примеров пакетов JsonRPC на любой такой сервер.
Я решил, что будет лучше написать мою тестовую оснастку только с помощью обычных базовых сценариев оболочки, которые доступны на всех платформах из коробки. Таким образом, каждый может использовать мою тестовую систему на своем языковом сервере. (Если бы я вместо этого написал его на Python, скажем, мне было бы проще писать, но это заставило бы людей C# изучать + устанавливать python только для того, чтобы запустить его, а также Typescript, PHP, OCaml, Go и другие близкие.)