bash에서 CTRL + 4 (및 CTRL + \)의 기능은 무엇입니까?


22

방금 우연히 CTRL+ 명령 줄에서 입력을 4 읽는 프로그램을 닫습니다 stdin.

이것이 프로그램 읽기에 CTRL+ 4또는 CTRL+ /를 입력 할 때의 모습입니다stdin

$ cat
wefwef
wefwef
^\Quit
$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
^\Quit
$

내가 얻을 ^\Quit표시 한 다음 프로그램을 닫습니다. 이것의 차이는 사용하는 것에 비해 무엇 ^C이나 ^D? 무엇을 ^\Quit합니까?

편집 : CTRL+ \가 똑같은 일을한다는 것을 알았습니다.

답변:


37

Ctrl + 4는 ^ \를 보냅니다.

터미널은 키가 아닌 문자 (또는보다 정확하게 바이트)를 보냅니다. 인쇄 가능한 문자를 나타내는 키를 누르면 단말기는 해당 문자를 응용 프로그램으로 보냅니다. 대부분의 기능 키는 이스케이프 시퀀스로 인코딩됩니다 : 문자 번호 (27) 양식의 일부 keychords로 시작하는 문자 시퀀스 Ctrl+ character, 그리고 몇 가지 기능 키가 제어 문자로 전송됩니다 -에 ASCII 문자 세트 , 모든 현대 컴퓨터 기초로 사용 (유니 코드, ISO 라틴어 n등은 모두 ASCII의 상위 집합입니다.) 33 문자는 제어 문자입니다. 문자 번호는 0-31 및 127입니다. 제어 문자는 인쇄 할 수 없지만 응용 프로그램에 영향을 미칩니다. 예를 들어, Control-J (일반적으로 ^ J로 표시됨) 인 문자 10은 개행 문자이므로 터미널에서 해당 문자를 표시하면 문자를 표시하지 않고 다음 행으로 커서를 이동합니다. 이스케이프 문자 자체는 제어 문자 ^ [(값 27)입니다.

모든 Ctrl+ 키 character코드 를 포괄 할 수있는 제어 문자가 충분하지 않습니다 . 문자와 문자 만 @[\]^_?해당 제어 문자를 갖습니다. Ctrl+ 4또는 Ctrl+ 를 누르면 $(내가 Ctrl+ Shift+ 라고 추정 4) 터미널은 전송할 것을 선택해야합니다. 터미널과 구성에 따라 몇 가지 일반적인 가능성이 있습니다.

  • 터미널은 Ctrl수정자를 무시하고 문자 4또는을 보냅니다 $.
  • 터미널은 누른 정확한 키와 수정자를 인코딩하는 이스케이프 시퀀스를 보냅니다.
  • 터미널은 다른 제어 문자를 보냅니다.

많은 터미널이 숫자 행의 일부 키에 대한 제어 문자를 보냅니다.

  • Ctrl+ 2→ ^ @
  • Ctrl+ 3→ ^ [
  • Ctrl+ 4→ ^ \
  • Ctrl+ 5→ ^]
  • Ctrl+ 6→ ^^
  • Ctrl+ 7→ ^ _
  • Ctrl+ 8→ ^?

나는이 특별한 협약이 어디서 일어 났는지 모른다.

Ctrl+ |Ctrl+ Shift+ 이기 때문에 같은 문자를 \보내고 터미널은 Shift 키를 눌렀는지 여부에 상관없이 ^ \를 보냅니다.

^ \ 종료

터미널 자체 (보다 정확하게는 커널의 일반 터미널 지원)는 몇 가지 제어 문자를 특수하게 해석합니다. 이 해석은 다른 문자를 맵핑하거나 문자 자체를 처리하려는 애플리케이션에 의해 해제되도록 구성 할 수 있습니다. 잘 알려진 이러한 해석 중 하나는 Return키로 문자를 보내는 ^ M 은 터미널이 쿠킹 모드 인 경우 응용 프로그램에 현재 행을 응용 프로그램에 전송하는 것으로 응용 프로그램은 한 줄씩 입력을받는 것입니다.

일부 문자 는 포 그라운드에서 응용 프로그램으로 신호 를 보냅니다 . ^ C는 인터럽트 신호 (SIGINT)를 전송합니다. 이 신호 는 일반적으로 응용 프로그램에서 수행중인 작업을 중지하고 사용자의 다음 명령을 읽도록 지시합니다. 비 대화식 응용 프로그램은 일반적으로 종료됩니다. ^ \ 종료 신호 (SIGQUIT)를 전송합니다. 이 신호 는 일반적으로 아무 것도 저장하지 않고 가능한 빨리 응용 프로그램을 종료하도록 지시합니다. 많은 응용 프로그램은 기본 동작을 무시하지 않습니다. 즉, 응용 프로그램을 즉시 종료하는 것 ¹. 따라서 또는에서 Ctrl+ 4(또는 ^ \ 문자를 보내는 항목) 를 누르 cat거나 bc둘 다 기본 동작을 무시하지 않으면 응용 프로그램이 종료됩니다.

터미널 자체 ^\는 메시지 의 일부를 인쇄합니다 . 입력 한 문자를 시각적으로 보여 주며 터미널은 요리 모드에 있고 반향이 켜져 있습니다 (문자는 입력하는 즉시 문자를 입력하자마자 터미널에 의해 표시됨) 문자가 응용 프로그램으로 만 전송되고 표시되도록 선택하거나 선택하지 않을 수있는 비에코 모드) 그 Quit부분은 bash에서 온 것입니다. 자식 프로세스가 종료 신호로 죽었다는 것을 알았습니다.

쉘은 모든 공통 신호를 처리하므로 쉘에 ^ \를 입력하면 세션이 종료되지 않고 ^ C와 같은 새로운 프롬프트가 표시됩니다.

stty명령 으로 터미널 설정을 재생할 수 있습니다 .

¹ 그리고 전통적으로 코어 덤프를 생성 하지만 오늘날 많은 시스템에서 기본적으로이를 비활성화합니다.


SIGINT는 포 그라운드 프로세스 그룹을 종료하고 SIGQUIT는 코어 덤프로 그룹을 종료합니다. 두 신호를 모두 처리 할 수 ​​있습니다. 다음 명령읽고 무슨 의미인지 잘 모르겠습니다 . 시스템은 초기 코어 덤프 크기 제한을 0으로 설정하는 것 이외의 다른 방식으로 코어 덤프를 비활성화하지 않습니다 (일반적으로 하드 덤프는 자유롭게 늘릴 수 있음).
Stéphane Chazelas

@ StéphaneChazelas 사용자 상호 작용을 수행하는 프로그램에서 SIGINT의 일반적인 의미는 현재 사용자 명령을 취소하고 사용자가 프로그램과 상호 작용할 수 있도록하는 것입니다. 즉, 기본 명령 루프로 돌아갑니다. 반면에 SIGQUIT가 종료되지 않는 프로그램 (신호 처리기의 버그 제외)을 본 기억이 없습니다. 실제로 많은 시스템에서 기본적으로 코어 덤프를 비활성화하는 방법은 코어 덤프 크기 소프트 제한을 0으로 설정하여 원하는 경우 사용자가이 기본 설정을 자유롭게 변경할 수 있도록하는 것입니다.
Gilles 'SO- 악마 그만'

예외입니다. SIGINT는 현재 실행중인 작업을 종료합니다. 소수의 응용 프로그램 만이 확장하여 자체 "전경"작업을 중단 할 수 있습니다. less또는 생각하고 있어야합니다 vim. 에가 있습니다 cmd | less, CTRL-C일반적으로 죽이지 않는다 cmd(에있는 동안 less은) 검색과 같은 현재의 액션을 (취소 처리 것) (계속)
스테판 Chazelas가

그 점에서 당신의 대답이 혼란 스럽습니다. SIGQUIT가 일반적으로 처리되지 않는다는 사실은 동일한 방식으로 사용되지 않는다는 것입니다. CTRL-C를 눌러 현재 수행중인 작업을 중단합니다. 코어 덤프를 생성하기 위해 디버깅을 위해 매우 자주 CTRL- \를 사용합니다. 일반적으로 응용 프로그램이 그렇게하려고하는 이유는 없습니다.
Stéphane Chazelas

@ StéphaneChazelas 그저 사용자 명령을 읽는 대부분의 터미널 기반 응용 프로그램입니다. 예를 들어 REPL (bash, dash, ksh, zsh, python, irb, fsharpi, Mathematica,…). 거의 드물지 않습니다. 첫 번째 주석은 SIGINT와 SIGQUIT를 너무 다르게 그리는 것에 반대하고 최신 주석은 SIGINT와 SIGQUIT를 너무 비슷하게 그리는 것에 반대합니다.
Gilles 'SO- 악마 그만'

7

Gilles 답변 외에도 Ctrl-v+ key( 이 경우 Ctrl-v+) Ctrl+4를 사용하여 bash에서 인쇄 할 수없는 문자를 입력 하고 문자 코드를 확인할 수 있습니다.

$ printf '^\' | od -An -tu    # input ^\ as C-v C-4
28

체크인 man ascii할 때 파일 구분 기호 (FS) 에 해당하는 문자의 10 진수 코드를 얻습니다 .


ctrl + v는 무엇을합니까? 나는 "클립 보드 붙여 넣기"에 익숙합니다.
JDługosz

2
@ JDługosz : Ctrl-V는 터미널 이 다음 문자를 해석 하지 않도록 지시합니다 . 불행히도 GUI 키 조합이 이러한 제어 문자를 대신하여 불필요한 혼란을 초래했습니다. 예전에는 리눅스가 GUI 키에 Alt- [Key]를 사용 했었지만 (예 : 복사 / 붙여 넣기에 Alt-C / Alt / V), 사람들은 분명히 Windows와 동일한 작업을하는 것이 더 중요하다고 생각했습니다. 한편 Mac 사용자는 여전히 해당 작업에 Ctrl 키 대신 Command 키를 사용하는 데 아무런 문제가 없습니다.
celtschk

(짧은) 명령은 다음과 같습니다. printf '%d\n' '"^\'?
Isaac
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.