저는 bash를 지원하지 않고 ssh 터미널에서 sh만 지원하는 쌍을 이루는 임베디드 Linux 설치를 사용하고 있습니다. 연결된 USB 장치로 16진수 데이터를 보내야 합니다 /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
백슬래시 이스케이프를 지원해야 합니다.
유일한 문제는 표준과 같은 8진수 이스케이프 \001
만 \x01
있으므로 printf
.printf "\x01"
그래도 작동하지 않으면 8진수로 전환해야 합니다. 프로그래머의 계산기를 사용하여 오프라인으로 변환을 수행하거나 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
바이너리 세트를 생성하는 중간 단계 없이 이 작업을 수행할 수 있는 더 좋은 방법이 있다면 좋겠지만 현재는 가능합니다.