Bash에서 지연 일시 중단 (Ctrl-Y)의 목적은 무엇입니까?


30

Bash 매뉴얼 페이지의 전체 부분은 다음과 같습니다.

bash가 실행중인 운영 체제가 작업 제어를 지원하는 경우 bash에는이를 사용하는 기능이 있습니다. 프로세스가 실행되는 동안 일시 중단 문자 (일반적으로 ^ Z, Control-Z)를 입력하면 해당 프로세스가 중지되고 제어를 bash로 리턴합니다. 지연된 일시 중단 문자 (일반적으로 ^ Y, Control-Y)를 입력하면 터미널에서 입력을 읽으려고 할 때 프로세스가 중지되고 제어는 bash로 리턴됩니다. 그런 다음 사용자는 bg 백그라운드에서 작업 을 계속하기 위해 명령을 사용하여이 작업의 상태를 조작 할 수 있습니다 .fg명령을 포 그라운드에서 계속하거나 kill 명령을 사용하여 종료하십시오. ^ Z는 즉시 적용되며 보류중인 출력과 자동 완성 기능을 버리는 추가 부작용이 있습니다.

나는 결코 사용하지 않았다 Ctrl- Y; 나는 단지 그것에 대해 배웠다. 나는 Ctrl- Z(일시 중단)으로 만 잘했습니다.

나는이 옵션이 무엇인지 상상하는 것을 시도하고있다 위해 . 언제 유용할까요?

(이 기능은 모든 Unix 변형에는 존재하지 않습니다. SolarisFreeBSD 에는 있지만 Linux에는 없습니다. 해당 설정은 stty dsusp입니다.)

아마도 덜 주관적 : 함께 수행 할 수 있습니다 무엇인가 Ctrl- Y와 마찬가지로 쉽게 수행 할 수 없습니다 Ctrl- Z?


@Gilles, FreeBSD는을 가지고있는 것처럼 보이지만 stty dsusp^ Y (Solaris 에서 했음) 에 SIGTSTP를 보내지 못했습니다. 당신은?
Stéphane Chazelas

답변:


23

csh에 대한 4BSD 매뉴얼에서 :

A ^Z는 즉시 적용되며 보류중인 출력 및 읽지 않은 입력이 입력 될 때 삭제되는 인터럽트와 같습니다. ^Y프로그램이이를 읽으 려고 시도 할 때까지 STOP 신호를 생성하지 않는 또 다른 특수 키가 있습니다 (2). 이 명령은 읽은 후에 중지하려는 작업에 대한 일부 명령을 준비 할 때 유용하게 미리 입력 할 수 있습니다.

따라서 첫 번째 입력을 처리하는 동안 여러 입력을 입력하고 완료된 후 작업을 중지하는 것이 목적입니다.


이 설명은 bash 매뉴얼과 약간 다릅니다. "프로그램 시도를 읽을 때까지 ... 정지 신호를 생성하지 않습니다 를. " 그것은 스트림 입력의 모든 같은 소리 까지^Y 성공적으로 읽을 것이고, 그 다음 때 ^Y충돌되는 프로세스가 중지됩니다. 내가 이것을 올바르게 읽고 있습니까?
와일드 카드

Mac OS X에서 테스트 한 @Wildcard의 경우 read ()가 반환되기 전에 프로세스가 중지되지만 ( Y 반환 된 read () 호출 후) 다시 시작한 후 ^ Y 이전의 입력을받습니다. . 나는 이것이 사용되도록 의도 된 것으로 생각되지만, 줄의 시작 부분에서 사용 되므로이 경우의 동작은 중요하지 않습니다. 실제 코드에서 ^ Y가 사용자 프로세스 읽기 버퍼에 복사되었을 때 일시 중단 된 것으로 의심됩니다.
Random832

나는에 맞았다 원래 BSD 커널의 ttread 기능 이 장을 살펴볼 수 있으며, 현대 OSX
Random832

그러나 프로세스가 재개되면 프로세스가 취소 ^Y되고 프로세스가 재개되기 전에 터미널을 닫은 경우에도 전화가 성공하고 터미널에 입력 한 데이터가 포함됩니다 . 권리? ( "... 다시 시작하면 ^ Y 이전부터 입력을받습니다." 이것이 의미하는 바입니다. 나는 보통 C 코드를 다루지 않습니다.) :)
Wildcard

예. 그리고 마지막에 줄 바꿈없이 반환됩니다. 표준 모드에서 읽는 경우에는 드문 경우입니다 ([텍스트를 입력하고 ^ D를 한 번 누른 경우와 유사]) 나는이 사건에 대해 많이 생각하지 않았다고 생각합니다. 실제로 줄의 시작 부분에 입력하도록 의도되었습니다.
Random832

11

루프 읽기 입력과 실행이 있다고 가정하십시오. 새로운 명령을 얻기 위해 명령 행으로 돌아 가기 전에 작업이 명령을 중단하지 않고 계산하는 현재 명령을 완료하도록하는 것이 유용 할 수 있습니다. 따라서 사이클을 종료합니다. 이는 루프를 정상적으로 종료하고 read제한 시간이 초과 되면 루프 가 다시 실행되지 않도록합니다 .


이 터미널 어쨌든 입력을 읽으려고거야하지만, 그것은 것입니다 중지 그 시점에서 (당신의 입력 대기), 당신은 할 수 ^Z그것을 다음 .
와일드 카드

예. 업데이트를 참조하십시오.
Tomasz

하나 더 확인하십시오. @Wildcard
Tomasz

1
그러나 시간이 초과되면 특별한 일이 없다면 우아하게 끝나지 않습니까?
Daniel Wagner

1
그것은 수도. 그러나 계속해서 기본 작업을 수행 할 수도 있습니다.
Tomasz

4

유용 할 수있는 한 가지 시나리오를 생각할 수 있지만, 이는 엣지 케이스입니다.

정리 루틴의 일부로 삭제되기 전에 분석하려는 임시 파일을 작성하는 스크립트를 디버깅한다고 가정하십시오.

read foo파일이 작성된 후 (정리 전) 어딘가에 추가 하고 스크립트를 실행 한 다음 생성 되는대로 Ctrl- Y를 누를 수 있습니다. 그런 다음 필요한 작업을 수행하기 위해 백그라운드에서 스크립트를 일시 중지 한 상태로 프롬프트가 표시 fg되고 스크립트를 완료 할 수 있습니다 .


1
어쨌든 스크립트가 입력을 기다릴 것 같지 않습니다. 따라서 입력하라는 메시지를 표시 한 다음로 일시 중단 할 수 있습니다 ^Z. 즉 : 당신이 입력 한 후 fg당신은 스크립트를 일부 입력을 제공해야합니다 어쨌든 이 계속 전에. 따라서 내 질문; 여전히의 요점을 보지 못합니다 ^Y. (응답 해 주셔서 감사합니다!) :)
Wildcard

2

내가 생각할 수있는 유일한 시나리오는 (심지어 설득력이 없다고 생각하더라도) 쉘 명령에 미리 입력을 사용하려는 경우입니다. 나중에 어떤 시간에 입력을 읽는 명령이 실행 중이라고 가정하십시오. 그런 다음 ^ Y를 수행 한 다음 실행중인 명령이 일시 중단 될 때 실행할 다음 셸 명령을 즉시 입력 할 수 있습니다. 필자는 수십 년 동안 BSD 유닉스를 실제로 사용했다고 생각하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.