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:] ]
기본적으로)입니다.