con*_*tti 0 bash gnu-screen string escape-characters
我有一个非常简单的类似聊天的工具,可以在 GNUscreen会话中运行。该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
Run Code Online (Sandbox Code Playgroud)
非常简单,但可以根据我的要求完成工作。只有一个问题:当我按下ESC或 任何箭头键时,它会插入一个转义序列,^[[D例如。这会弄乱文件,导致糟糕的输出。
所以我的问题很简单:如何转义输入read以便写入文件是安全的?
我试过echo "[${ctime}] User: ${msg}" | strings >> file.txt这让它好多了,不再有大的混乱(例如没有被覆盖或错误地输出),但事情仍然不完美(例如输入te^[[Dst会变成te\n[Dst(\n作为一个实际的新行) )。
稍微不同的方法怎么样?您可以允许用户使用它们来编辑输入行,而不是删除转义字符和序列read -e。
如果需要,您可以通过记录聊天消息历史记录来进一步进行此操作,如下所示:
...
read -e -p "Message: " msg
history -s "$msg"
...
Run Code Online (Sandbox Code Playgroud)
有了这个,如果有人在消息中打错字,他们可以点击向上箭头,使用左右箭头来编辑和修复错字,然后点击返回以发送更正的消息。