`stty -echo는 어떻게 작동하나요? cat -v; stty echo`는 특수 키를 에코할 수 있나요?

`stty -echo는 어떻게 작동하나요? cat -v; stty echo`는 특수 키를 에코할 수 있나요?

stty -echo; cat -v; stty echo터미널로 보낸 키를 보는 기술입니다. 하지만 이 명령이 어떻게 작동하는지 알고 싶습니다. 제거하면 stty -echo입력한 내용이 두 번 인쇄됩니다. stty -echo터미널에서 입력한 내용이 인쇄되지 않도록 하는 것으로 알고 있습니다 . 좀 더 구체적으로 말하자면, 내가 원하는 것은"';'를 사용하여 먼저 백로그를 비활성화한 다음 cat -v 명령 후에 활성화할 수 있는 이유는 무엇입니까?" 근본적으로?

답변1

;명령을 분리하여 하나씩 실행하면 됩니다.

cat여기에서 대화형 셸의 프롬프트에서 이 명령을 입력하면 정상적으로 종료 하는 한 ( Ctrl+를 D두 번 사용하거나 스페이스 키를 누르는 경우) 프롬프트로 돌아오면 터미널 장치 로컬 에코가 비활성화되고 다시 -할 수 있게 하다. 철사).

catSIGINT 또는 SIGQUIT로 중단 되면 ( Ctrl+ C또는 Ctrl+를 누른 경우 \) 쉘은 bash전체 명령줄을 취소하므로 stty echo명령은아니요실행되고 로컬 에코가 다시 활성화되지 않습니다.

zsh셸 에서는 다음을 수행할 수 있습니다.

STTY=-echo cat -vt

이는 명령 기간 동안에만 특정 tty 설정을 변경하는 특수 구문입니다. 이렇게 하면 중단되더라도 cattty 설정이 복원됩니다.

그러나 zsh무슨 일이 있어도 tty 로컬 에코는 항상 자체적으로 복원됩니다.

에서는 bash도우미 함수를 사용하여 다음과 같은 작업을 수행할 수 있습니다.

with_different_tty_settings() (
  tty_settings=$(stty -g) # save current settings
  trap 'stty "$tty_settings"' INT EXIT QUIT
  set -o noglob
  local IFS
  stty $STTY # split $STTY on default IFS characters
  "$@"
)

다음과 같이 호출됩니다 cat.

STTY=-echo with_different_tty_settings cat -vt

zshSTTY( 작업 일시 중지(예: + )를 처리하지 않는 s 와 대조적입니다 Ctrl.)Z

로 변경하면 + 에서 보낸 문자를 STTY='-echo -isig'볼 수 있습니다 .CtrlC

그걸로 STTY='raw -echo'볼 수 있습니다모두문자(tty 라인 규칙에 따라 수정되지 않고 일단 입력되면)를 종료할 수 없습니다 cat.

하지만 3초 동안 활동이 없으면 종료할 수 있습니다 STTY='raw -echo time 30 min 0'.cat

관련 정보