screen
私はGNUセッション内で実行される非常に簡単なチャットのようなツールを持っています。ウィンドウscreen
が分割され、上部が実行中で、下部tail -f file.txt
が次のスクリプトを実行しています。
#!/bin/bash
while : ; do
read -p "Message: " msg
ctime=$(date +"%H:%M:%S")
echo "[${ctime}] User: ${msg}" >> file.txt
done
とても簡単ですが、要求どおりに作業は完了しました。一つの問題があります。ESCまたは、矢印キーのいずれかを押すと、エスケープシーケンスが挿入されます(例:)^[[D
。これによりファイルが混乱し、誤った出力が発生します。
read
だから私の質問は簡単です。ファイルに安全に書き込むためにどのように入力をエスケープしますか?
私はそれを試してみましたが、これははるかに良くecho "[${ctime}] User: ${msg}" | strings >> file.txt
なり、もはや大きな混乱は起こりませんが(たとえば、何も上書きまたは間違って出力されません)、まだ完璧ではありません(入力は(実際の新しい行です))te^[[Dst
。te\n[Dst
\n
答え1
少し違ったアプローチはどうですか?ユーザーがエスケープ文字とシーケンスを削除するのではなく、エスケープ文字とシーケンスを使用して入力行を編集できるようにすることができますread -e
。
必要に応じて、以下のようにチャットメッセージの履歴を記録して、さらに一歩進むことができます。
...
read -e -p "Message: " msg
history -s "$msg"
...
これにより、誰かがメッセージのスペルを間違っている場合は、上矢印をクリックし、左右の矢印を使用してスペルエラーを編集して修正し、もう一度クリックして修正メッセージを送信できます。
答え2
メッセージ文字列から印刷されない文字をすべて削除します。
#!/bin/bash
while read -p 'Message: ' message; do
printf '[%s] User: %s\n' "$( date +%T )" "${message//[^[:print:]]/}"
done >>file.txt
パラメータ置換は${message//[^[:print:]]/}
変数値に拡張され、message
印刷できない文字はすべて削除されます。 POSIXロケールで印刷可能な文字は、英数字、句読点、および空白([[:alnum:][:punct:] ]
デフォルトでは)です。