私は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
バイナリセットを作成する中間ステップなしでこれを行うためのより良い方法があると思いますが、現在は可能です。