명령이 실행될 때 터미널에서 키 입력이 에코되는 이유는 무엇입니까?

명령이 실행될 때 터미널에서 키 입력이 에코되는 이유는 무엇입니까?

최근에 tail -f실행 중인 서버의 로그 파일을 실행하면서 버그를 진단하려고 하다가 실수로 키보드를 치고 문자를 입력했습니다. 이는 로그 출력과 혼합되어 어느 것이 어느 것인지 구별하는 것이 불가능합니다. 나는 이와 비슷하게 짜증나는 일을 수없이 경험했고, 여기 있는 다른 많은 사람들에게도 그런 일이 일어났을 것이라고 확신합니다.

그래서 내 질문은 이렇습니다.셸(또는 터미널 또는 이를 수행하는 모든 프로그램)이 키보드 입력과 명령 출력을 모호하게 혼합하는 이유는 무엇입니까?

나는 당면한 문제에 대한 실제적인 해결책을 요구하는 것이 아닙니다. stty -echo명령이 실행될 때와 stty echo완료될 때 셸을 실행하는 방법을 찾을 수 있을 것입니다 . 하지만 이렇게 단말기를 설계한 이유가 무엇인지 알고 싶습니다. 실용적인 목적이 있나요? 아니면 단지 호환성 때문에 수행된 작업이거나 전혀 고려하지 않은 작업입니까?

답변1

사람들은 일반적으로 자신이 입력하는 내용을 보고 싶어합니다(비밀번호가 아닌 이상) :-)

터미널은 언제든지 입력을 받아들이고 애플리케이션이 읽을 때까지 버퍼링합니다. 그뿐만 아니라 tty가 있을 때에도요리모드에서 커널은 한 번에 전체 줄을 버퍼링하고 몇 가지 기본 줄 편집 기능을 제공하여 버퍼링된 전체 줄을 삭제할 수 있습니다(기본 바인딩 Ctrlu백스페이스). 줄을 입력하고 편집하는 동안 Enter터미널에서 읽는 응용 프로그램은 키를 누를 때까지 아무 것도 읽지 않습니다.

커널의 tty 기능은 이와 같은 응용 프로그램이 tail터미널에서 출력을 생성하도록 예약되어 있는지 여부와 시기를 알 수 없으며 알 수 없습니다. 따라서 어떻게든... 취소(?)할 수 없습니다. 이 경우에는 이 경우에만 가능합니다.

어쨌든, 터미널에서 다른 작업이 실행 중이고 쉘이 명령을 읽을 준비가 되어 있지 않을 때 쉘의 다음 줄을 준비할 수 있다는 것은특징는 버그가 아니므로 제거를 권장하지 않습니다. 덜 유용할 수도 있지만 tail(자체적으로 종료되지 않음) 장기간 실행하는 동안 다음 명령을 미리 입력 cp하거나 make(예를 들어) 쉘이 일반적인 것을 얻기 전에 Ctrl- h및 - 를 사용하여 Ctrl명령을 편집하는 것이 좋습니다.u티모시 마틴에 쓰다코멘트:

(우연히) 입력한 키 입력이 화면에 나타나지 않는다는 점을 제외하면 less +F somefile유사한 기능을 제공한다는 점은 언급할 가치가 있습니다.tail -f somefileecho

예, 하지만 less이러한 문자가 반향되는 것을 방지할 뿐만 아니라;먹다그래서 그 내용을 읽고 싶어하는 다음 응용프로그램이 그것을 사용할 수 없게 됩니다!

마지막으로 또 다른 이유가 있습니다.

역사적 시대(나의 시대 이전!)에는 로컬 에코 기능을 갖춘 터미널이 일반적이었습니다. 즉, 터미널(보통 하드웨어에 있음)은 사용자가 로컬로 입력한 문자를 직렬 회선으로 보내는 동시에 에코백합니다. 이는 UNIX 시스템 연결에 대기 시간이 긴 경우에도 사용자에게 빠른 피드백을 제공하는 데 유용합니다(예:300 보드 모뎀자동 텔넷을 사용하여 느린 UNIX 시스템에 터미널 서버에 전화 접속토큰링네트워크 - 또는 무엇이든).

로컬 에코가 있는 터미널이 있는 경우 stty -echo항상 연결된 UNIX 서버에 있어야 합니다. 결과는 terminak과 거의 동일합니다.아니요로컬 에코(요즘 일반적인 에코) 및 stty echo활성화. 따라서 이러한 관점에서 볼 때 stty echo작업은 실행 중인 소프트웨어에 관계없이 문자를 수신하자마자 에코하여 터미널에서 로컬 에코가 발생하는 상황을 시뮬레이션하는 것입니다.

(그런데 로컬 에코가 있는 터미널이 있으면 비밀번호를 숨길 수 없습니다.)

답변2

를 사용하여 로컬 tty 장치에 대한 특정 명령을 zsh비활성화하려면 다음을 수행할 수 있습니다.echo

STTY=-echo a-specific-command

zshstty명령이 종료되면 특정 설정이 적용되고( 호출을 통해) 복원됩니다 .

물론, tty 장치에서 데이터를 읽지 않는 응용 프로그램에 대해서만 이 작업을 수행할 수도 있습니다.

관련 정보