3. 왜 (항상) 작동하지 않는가

이제 기본적인 문제가 명확하리라 본다. 문제는 키보드와 콘솔 어플리케이션들 사이에서 존재하는데 이 둘이 오직 ASCII 문자열만을 통해서 통신이 가능하다는 사실이다. 따라서 특수 키들은 키심볼에서 문자열로 변환되고 다시 이 문자열이 키 기능으로 바뀌어져야 한다. 다른 콘솔들은 이 변환에 대해 서로 다른 기준을 가지고 있기 때문에 우리는 터미날 데이타베이스가 필요한 것이다. 아주 작은 문제를 제외하곤 시스템은 제대로 작동할 것이다. 문제는, 모든 시스템이 제대로 설정된 것은 아니며 모두가 터미날 데이타베이스를 사용하는 것은 아니라는 점이다.

어플리케이션은 사용할 데이타베이스 항목을 알 수 있는 방법이 필요한데 이는 보통 TERM 환경변수를 알맞게 설정하면 된다. 일부 경우엔 TERM이 지정하는 데이타베이스 항목과 터미날 에뮬레이터간의 불일치가 있기도 하다.

더군다나 많은 어플리케이션들은 터미날 데이타베이스를 (적어도 전부를) 사용하지 않고 BSDEL ASCII 코드들을 의도한 의미로 해석한다. 다시 말해 데이타베이스를 찾아보지도 않고 각 코드들에 기능을 할당한다 (물론 일반적으로 그 기능들은 커서가 가리키는 혹은 커서 이전의 문자를 지우는 것이다). 그 결과 이제 우리의 멋진 쳬계는 완전히 망가져 버렸다 (모든 리눅스 사용자들이 뼈저리게 알고 있는것 처럼). 예를 들어 bashDEL앞쪽 한 문자 지움을, 다시 말해 backspace 기능을 해야 한다고 가정한다. 결국 일반적인 설치 환경에서 Backspace 키는 콘솔 상에서 예상대로 작동하는데 이는 두 번 꼬아진 이유 때문이다! 물론 Delete 키는 작동하지 않는다. 이는 bashkdch1 기능에 대해서 터미날 데이타베이스를 찾아보지 않기 때문이다.

일들이 어떻게 꼬아져 있는지를 보기 위해서 Red Hat 배포판 (그리고 여타 다른 배포판들도 아마) 에서 제공되는 fix_bs_and_del 스크립트를 보자. 이 스크립트는 몰래 BackSpace 키심볼을 Backspace 키로, Delete 키심볼을 Delete 키로 할당해준다. 이제 쉘은 제대로 작동한다! 그러나 키심볼과 터미날 데이타베이스의 정상적인 관계에 의존하는 프로그램들은 모두 정상작동을 하지 않게 된다. 이는 Delete 키심볼이 DEL로 변환되고 이것이 다시 terminfo 데이타베이스에 의해 kbs 키 기능으로 변환되어 그런 - 정상적인 - 프로그램들에서는 두 키가 모두 backspace 기능을 갖게 되기 때문이다.