임의의 콘솔 출력이 터미널을 손상시키는 것을 방지하는 방법은 무엇입니까?


23

SE에 의해 깨진 터미널에서 복구하는 방법을 보여주는 많은 질문이 있습니다 cat /dev/urandom. 이 문제에 익숙하지 않은 사람들을 위해-여기에 관한 내용 :

  1. 실행 cat /dev/urandom하거나 이에 상응하는 항목 (예 :) cat binary_file.dat입니다.
  2. 쓰레기가 인쇄됩니다.
  3. 명령이 끝난 후에도 터미널이 쓰레기를 계속 인쇄한다는 점을 제외하고는 괜찮을 것입니다 ! 실제로 g ++ 출력 인 잘못 렌더링 된 텍스트의 스크린 샷입니다.

    스크린 샷 예

    사람들이 C ++ 오류에 대해 옳았다 고 생각합니다.

일반적인 해결책은 실행하는 stty sane && reset것이지만, 이런 일이 발생할 때마다 실행하는 것은 성가시다.

그 때문에,이 질문에서 내가 집중하고 싶은 것은 이것이 일어나는 원래의 이유 와 그러한 명령이 내려진터미널이 깨지는 것을 방지하는 방법 입니다. 문제가되는 명령을 tr또는에 파이핑하는 등의 솔루션을 찾고 있지 않습니다. xxd실제로 프로그램을 실행 / 인쇄하기 전에 프로그램 / 파일 출력 바이너리를 알고 있어야하며, 이러한 데이터를 출력 할 때마다 기억해야하기 때문입니다. .

URxvt, PuTTY 및 Linux 프레임 버퍼에서 동일한 동작을 발견 했으므로 이것이 터미널 관련 문제라고 생각하지 않습니다. 내 주 용의자는 무작위 출력에 문자 인코딩을 뒤집는 ANSI 이스케이프 코드가 포함되어 있다는 것입니다 (사실 cat /dev/urandom다시 실행 하면 터미널 을 깨뜨릴 가능성이 있습니다 .이 이론을 확인하는 것으로 보입니다). 이것이 맞다면이 탈출 코드는 무엇입니까? 비활성화하는 표준 방법이 있습니까?

답변:


22

아니:

  • "비활성화"하는 표준 방법이 없으며
  • 파손의 세부 사항은 실제로 터미널마다 다르지만
  • 오작동을 일으킬 수있는 일반적으로 구현되는 기능이 있습니다.

일반적으로 구현 된 기능에 의해 활성화되는 VT100 스타일 대체 문자 세트에 모습 ^N^O(사용 / 사용 안 함). UTF-8 모드를 사용하는 경우 그 일부 단말기에서 억제 할 수 있지만, 같은 단말기들은 이스케이프 시퀀스 (GNU 화면, 리눅스 콘솔, 퍼티 여기에 대해 이야기) 화면을 부수고위한 충분한 기회가 않습니다 인식합니다.

다른 이스케이프 시퀀스 중 일부는 예를 들어 터미널에 의한 호스트에 의한 질의 (탈출 시퀀스)에 대한 응답에 의존한다. 호스트가 예상하지 않으면 화면에 휴지통이 표시됩니다.

다른 경우 (예를 들어 Linux 콘솔의 하드 코드 된 이스케이프 시퀀스가있는 네트워크 장치에서 볼 수 있음) 다른 터미널에서는이 코드가 잘못 코딩 된 것으로 보이며 정지 된 것처럼 보입니다.

따라서 ... 단일 터미널에만 집중하고 귀찮은 것처럼 보이는 것을 제거 할 수 있습니다 (예 : 편집기에서 위치 지정을 위해 마우스를 사용할 수있는 기능을 제거하는 것이 좋습니다). 그리고 명백한 구멍이없는 것을 얻을 수 있습니다. 그러나 그것은 단지 하나의 터미널입니다.


0

당신이 통제하고 명령이 당신을 망칠 것이라는 것을 알고 있다면, 나는 일반적으로 적은 결과로 출력을 볼 것입니다.

head -n4 /dev/urandom | less

이 평범한 쓰레기를 잡아서 제정신으로 표현하는 것처럼 보이며 q로 종료 한 후에도 기억에 아무런 문제가 없었습니다 .


2
문제는 특히 프로그램이 이진 출력을 생성한다는 것을 미리 알아야하는 솔루션을 찾고 있지 않다고 말합니다.
Barmar

-1

명령 등의 출력을 티에 파이프하십시오.


2
그게 어떻게 도움이 되나요? 여전히 출력을 인쇄하지만 파일로 저장합니다.
Barmar

아마 당신은 more또는 less?
Barmar

내 중심으로 영업 당 "... . 같은 명령을 실행 나는 다음과 같은 해결책을 찾는 게 아니에요 배관 잘못된 명령을"
제프 쉘러
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.