我正在使用配对的嵌入式 Linux 安装,该安装不支持 bash,仅支持 ssh 终端上的 sh。我需要将十六进制数据发送到连接的 USB 设备/dev/ttyUSB0
。我可以使用 bash (在 Ubuntu 18.04 的桌面安装上)轻松地完成此操作echo -en '\x01\x02\x03' > /dev/ttyUSB0
,但 sh 似乎不支持反斜杠转义。是否有另一种相对简单(甚至不那么容易)的方法来使用 sh 做到这一点?
不幸的是,$SHELL --version
没有返回任何东西。内核版本是4.1.0。
答案1
这是原因之一为什么 printf 比 echo 更好。的实现echo
在是否以及如何支持选项和反斜杠转义方面有所不同,但所有版本printf
都应支持反斜杠转义。
唯一的问题是只有八进制转义符,就像\001
标准的一样,所以\x01
即使使用printf
.不过你可以先尝试一下printf "\x01"
。
如果这不起作用,您将不得不切换到八进制。要么使用任何程序员的计算器离线进行转换,要么使用类似于printf "%o\n" "0x61"
转换的东西或使用类似的东西来批量转换您的字符串:
echo 'foo\x01\x61' | perl -pe 's/\\x([0-9a-fA-F]{2})/sprintf("\\%03o", hex($1))/ge'
(它应该给foo\001\141
)
答案2
您正在混合斜杠/
和反斜杠\
。
转义是通过反斜杠完成的:
echo -en '\x01\x02\x03' > /dev/ttyUSB0
答案3
最后,我使用我的 Ubuntu 桌面来创建二进制文件。
echo -en '\x01\x02\x03' > binary.file
然后,将二进制文件复制到运行 ash shell 的系统后,我将脚本中的该文件复制到 USB。
cat binary.file > /dev/ttyUSB0
如果有更好的方法来做到这一点,而不需要创建一组二进制文件的中间步骤,那就太好了,但这目前是可行的。