如何使用bash脚本处理Chrome原生消息API调用?
我成功地用python和this example实现了它。
当然,我可以用subprocess
从python代码调用bash
,但是否可以跳过python直接在bash
中处理消息?
有问题的部分是将JSON序列化的消息读入变量。消息使用JSON序列化,UTF-8编码,并通过stdin以本机字节顺序在32位消息长度之前。
echo $*
仅输出:chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/
还有类似
read
echo $REPLY
不输出任何内容。没有JSON消息的迹象。Python使用了struct.unpack
。可以在bash
中实现吗?
2条答案
按热度按时间khbbv19g1#
我建议不要使用(bash)shell脚本作为本地消息传递主机,因为bash太有限了,没有用。
不带任何参数的
read
在终止前读取一整行,而本机消息传递协议指定前四个字节指定后续消息的长度(按本机字节顺序)。Bash是一个处理二进制数据的糟糕工具。
read
命令的改进版本将指定-n N
参数在N
字符后停止阅读(注意:而不是字节)和-r
来删除一些处理。例如,下面将前四个字符存储在一个名为var_prefix
的变量中:即使你假设这存储了变量中的前四个字节(它没有!),那么你必须将字节转换为整数。我是否已经提到bash会自动删除所有NUL字节?这种特性使得Bash作为一个完全有能力的本地消息传递主机完全没有价值。
您可以通过忽略前几个字节来科普这个缺点,并在发现
{
字符(JSON格式请求的开头)时开始解析结果。在此之后,您必须读取所有输入,直到找到输入的结尾。您需要一个JSON解析器,当它遇到JSON字符串的结尾时,它会停止阅读输入。祝你写得好。生成输出更简单,只需使用
echo -n
或printf
。下面是一个最小的例子,假设输入以
}
结尾,读取它(不处理)并返回结果。虽然这个演示可以工作,但我强烈建议不要使用bash,而是使用更丰富的(脚本)语言,如Python或C++。vshtjzan2#
消息阅读可以在纯bash中完成,不需要使用任何子shell。
棘手的部分是阅读前4个字节,但这可以通过设置
LC_ALL=C
来完成,这将使bash将每个字节视为一个字符,并为read
使用以下选项:-n 1
一次读取一个字符(=字节)-r
防止反斜杠处理-d ''
使read
在阅读空字节后返回0我们可以使用
printf %d "'C"
将字符转换为数字表示。在我们得到长度之后,我们可以使用
read -r -N "$len"
从输入中读取正好那么多的字节。