Linux 使用bash从stdin读取二进制文件

Linux 使用bash从stdin读取二进制文件,linux,bash,embedded,sh,Linux,Bash,Embedded,Sh,我正在尝试创建一个小脚本,它的工作原理类似于netcat,但能够通过不同的接口(尤其是CAN总线)发送数据。 我想为不同的purose使用这个脚本,并且能够发送二进制文件,或者在CAN上运行remote/bin/sh等等 要做到这一点,我需要从stdin中读取每个字节“\n”、“\r”、“\t”等等,但我不知道如何读取 我已经创建了这样的示例,它正在工作,但在收到“\n”之前,脚本正在等待,但对于运行/bin/sh,我还希望发送“\t\t”以完成并进行二进制发送 while true; do

我正在尝试创建一个小脚本,它的工作原理类似于netcat,但能够通过不同的接口(尤其是CAN总线)发送数据。 我想为不同的purose使用这个脚本,并且能够发送二进制文件,或者在CAN上运行remote/bin/sh等等

要做到这一点,我需要从stdin中读取每个字节“\n”、“\r”、“\t”等等,但我不知道如何读取

我已经创建了这样的示例,它正在工作,但在收到“\n”之前,脚本正在等待,但对于运行/bin/sh,我还希望发送“\t\t”以完成并进行二进制发送

while true; do
    # read from stdin single character
    BYTE=$(od -A n -N1 -t x1 | sed 's/ *//g')
    # output to CAN interface  
    cansend $CAN $ADDRESS#$BYTE
done
我也尝试过这种方法,但是“\n”“\t”等字符被解释为零can帧

while true; do
    { IFS= read -rn1 BYTE ; cansend $CAN $ADDRESS#$(printf "%q" $BYTE | od -A n -t x1 | sed 's/ *//g') ; }
done
当然,排队字节也会很有帮助


请记住,我在嵌入式系统上使用它,没有python,也没有可能下载任何特殊命令。

Shell不是用于二进制数据的合适工具。shell用于跨命令操作字符流。在
“$BYTE”
变量引用周围添加引号,以避免不必要的
$'\n\t'
文件名拆分和全局处理模式。这是否回答了您的问题?虽然您可能可以绕过它,但shell脚本非常面向行。特别是,如果您想要不等待换行的“实时”输入,您可能希望考虑转移到其他方面—例如python可能适合您的需要(尽管使用python3,您确实需要担心无处不在的unicode支持会让人困惑),另一种选择是制作一个C程序—或修改现有的程序。只有一个想法(其他很多想法中的一个):免费的CANopen实现与一些PC示例程序(Win/Linux)一起提供,这些程序将数据放入已经集成的CAN驱动程序中(寻找“CANopenShell”)。您可以修改该应用程序以快速获得问题的合适解决方案。