CentOS에서는 다음을 사용합니다.
[root@localhost sbin]# echo -e "ab\bc"
ac
\b
백스페이스 키를 나타냅니다 .
하지만 내가 사용할 때 :
[root@localhost sbin]# echo -e "abc\b"
abc
인쇄되어 있는데 abc
왜 백스페이스가 아닌가요?
답변1
백스페이스 키 자체는 파괴적이지 않지만 대부분의 편집기(명령줄 포함)에서는 그렇게 표시합니다. 실제로 일어나는 일은 이러한 프로그램이 상호 작용할 때 커서를 백업한 다음 공백을 쓴 다음 다시 백업하여 커서를 올바르게 배치한다는 것입니다.
따라서 귀하의 라인은 아마도 echo -e "abc\b \b"
작동할 것입니다.
다음을 수행하여 이를 테스트할 수 있습니다 echo -n -e "abc\b"
(-n은 다음 행으로의 자동 점프를 제거합니다). 이제 프롬프트에 "c"가 포함됩니다.
\n
이는 "다음 줄로 이동(여백은 아님)을 의미함" 및 " \r
여백으로 이동(다음 줄은 아님)을 의미함" 과 다소 유사합니다 . 운영 체제는 이러한 문자를 다르게 해석합니다(Unix는 \n에 다음 줄을 추가하고 DOS에는 두 문자가 모두 있는 등).
답변2
예, 예상대로 작동합니다(x 문자가 제거됨).
$ echo -e 'ax\bc'
ac
예, 따라서 백스페이스 문자가 손실된 것처럼 보입니다.
$ echo -e 'abx\b'
abx
백스페이스 문자( \b
)는 키보드 키와 동일하지 않습니다 Backspace.
키보드 Backspace에 ^?
인쇄된 내용 Ctrl-VBackspace을
많은 편집자들은 이를 뒤로가서 문자를 삭제하는 것으로 해석합니다. 이는 단순히 공백을 인쇄하는 것보다 더 복잡합니다. 지워진 각 문자에 대해 오른쪽의 전체 줄을 왼쪽으로 한 칸 이동해야 합니다(와이드 문자의 경우 두 칸, 제어 문자의 경우 0). 또는 삭제된 문자가 새 줄을 바꾸려면 전체 줄을 한 줄 위로 이동하세요. 아니요, 그것은 단순한 문자가 아닙니다. 키보드 키에 연결된 전체 프로그램입니다 Backspace.
그러나 아니요, 백스페이스 문자는 실제로 콘솔에 기록됩니다.
다음 명령을 사용하여 콘솔로 전송되는 내용을 확인할 수 있습니다 od
.
$ echo -e 'abx\b' | od -vAn -tx1c
61 62 63 08 0a
a b x \b \n
그러면 어떻게 되나요?
- 문자열이
abx
콘솔에 기록됩니다. - 콘솔은
abx
라인 버퍼로 인쇄합니다. - 역할이
\b
콘솔에 기록됩니다. - 이 문자는
\b
콘솔 라인 버퍼를 한 문자 뒤로 이동시킵니다. - 이 문자는
\n
콘솔에 인쇄됩니다. - 콘솔 라인 버퍼는 다음 라인으로 이동합니다(아무것도 인쇄되지 않음).
- "문자열 끝"이 콘솔에 인쇄됩니다.
- 콘솔은 전체 라인 버퍼를 출력합니다.
이것이 콘솔이 작동하는 기본 방식입니다.
확인 해봐:
$ printf 'abcdef\b\b\b \n'
abc ef
이 문자는 d
공백으로 대체된 문자입니다.
x를 왜 'ax\bc'
삭제하나요?
c
문자가 문자를 덮어쓰게 되기 때문입니다 x
.