bash 쉘 cli를 사용하고 즉시 반환되지 않는 일부 프로그램을 실행하면 몇 가지 문자를 입력하고(기본적으로 이전 명령이 완료되지 않았다는 것을 알기 전에 다음 명령을 입력함) 입력은 항상 다음과 같습니다(구체적으로 Up 사용할 때 아래쪽 화살표 키를 사용하세요 :)
]]A^ or ]]B^
어쨌든 이 조기 입력이 "유해한" 것인지, 아니면 반환된 문자열이 무엇을 의미하는지 궁금합니다.
답변1
키보드의 일부 키는 실제 문자와 일치하지 않습니다. 예 A를 들어 및 a
키에는 고유한 전용 문자가 없습니다. 이러한 특수 키를 누르면 터미널은 해당 키에 해당하는 단일 문자를 가져오지 않고 대신 키 입력을 일반적으로 이스케이프 문자로 시작하는 여러 문자의 특수 시퀀스(일반적으로 로 표시됨 )로 변환합니다. 예를 들어 시퀀스 (즉, 키의 3개 문자: 이스케이프 및 )를 생성하는 것이 일반적입니다 . UpF1^[
Up^[[A
[
A
일반적으로 이 내용이 표시되지 않는 이유 ^[[A
는 대부분의 콘솔 응용 프로그램이 특수 시퀀스를 콘솔에 표시하는 대신 유용한 명령으로 변환할 만큼 똑똑하기 때문입니다. 터미널의 내장 에코를 끄고 자체적으로 낮은 수준의 처리를 수행하여 이를 수행합니다. 예 를 들어 , 명령을 때입니다bash
보고^[[A
Up^[[A
^[[A
이 메시지가 시간에 맞춰 표시 되면 Up일반적으로 터미널 에코가 켜져 있고 포그라운드 프로세스(터미널을 제어하는 프로세스)가 위에서 언급한 특별한 처리를 수행하지 않는다는 의미입니다. 이는 애플리케이션이 단순히 터미널을 무시하기 때문일 수 있습니다(대부분의 비대화형 명령과 마찬가지로). 일반적으로 쉘은 터미널을 정식 모드로 전환하고 포그라운드 프로세스를 실행하기 전에 에코를 켜고, 명령이 종료된 후 터미널 제어권을 다시 얻은 후 자체 설정을 복원합니다.
에코는 상당히 무해한 것 같습니다. 실행 중인 명령이 터미널에서 읽히지 않으면 키보드를 통해 생성된 문자가 bash
입력 대기열 에 들어갈 수 있으므로 bash
이력서를 읽으면 해석될 수 있으므로 입력하는 내용에 주의하세요. 터미널에서 일반적인 주문의 경우 .
1 이는 실제로 지나치게 단순화된 것입니다. 정확한 순서는 터미널 유형에 따라 다를 수 있으므로 콘솔 애플리케이션과 터미널 자체 사이에 여러 계층의 추상화 라이브러리가 있는 경우가 많습니다. 예를 들어 라이브러리를 bash
사용하여 readline
대부분의 입력을 수행합니다.
답변2
이러한 문자열은 입력한 특수 문자(예: home, end, arrow, tab 등)를 그대로 표현한 것입니다.
이들의 유해한 영향은 실행 중인 명령에 의해 제어되며, 터미널에서 입력을 받으면 이러한 문자는 입력의 일부가 됩니다.
터미널에서 입력을 받지 않으면 내가 알고 있는 Unix 버전에 어떤 부정적인 영향도 미치지 않아야 합니다.