Bashで変数文字列(ユーザー入力)を安全にエスケープする方法は?

Bashで変数文字列(ユーザー入力)を安全にエスケープする方法は?

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^[[Dstte\n[Dst\n

ベストアンサー1

少し違ったアプローチはどうですか?ユーザーがエスケープ文字とシーケンスを削除するのではなく、エスケープ文字とシーケンスを使用して入力行を編集できるようにすることができますread -e

必要に応じて、以下のようにチャットメッセージの履歴を記録して、さらに一歩進むことができます。

...
read -e -p "Message: " msg
history -s "$msg"
...

これにより、誰かがメッセージのスペルを間違っている場合は、上矢印をクリックし、左右の矢印を使用してスペルエラーを編集して修正し、もう一度クリックして修正メッセージを送信できます。

おすすめ記事