한 번의 키 누르기로 Ctrl-Z 및 bg를 수행하여 백그라운드에서 프로세스를 계속하려면 어떻게해야합니까? . 단일 키 누르기로 압축 할

이 작업을 일시 중단하고 Ctrl-Z bg시퀀스가 너무 자주 계속되도록하는이 패턴을 따릅니다 .

단일 키 누르기로 압축 할 수있는 방법이 있는지 궁금합니다.

내 껍질은 zsh



답변

Ctrl+의 Z순서는 없다 쉘, 단말기에 의해 처리된다. (유용한 배경 : ‘터미널’, ‘쉘’, ‘tty’및 ‘콘솔’의 정확한 차이점은 무엇입니까? )

확장 할 수 없는 작은 기능 집합 만 터미널의 키에 바인딩 할 수 있습니다 . 이러한 기능에 바인딩 된 사용자 정의 할 수 있지만 다른 기능을 추가 할 수는 없습니다. 이러한 기능은 세 가지 범주로 분류됩니다.

  • 자체적으로 제공하지 않는 프로그램의 명령 줄 버전 (표준 모드, 요리 모드 (원시 모드와 반대)) (실제로는 거의 사용하지 않음) : 파일 끝 ( eof, Ctrl+ D), 줄 끝 ( eol, Ctrl+ M), 왼쪽 문자 삭제 ( erase, Ctrl+ H), 왼쪽 단어 삭제 ( werase, Ctrl+ W), 줄 삭제 ( kill, Ctrl+ U).
  • 수동 흐름 제어 : stop( Ctrl+ S), start( Ctrl+ Q). 터미널이 컴퓨터를 따라 잡을 수 없거나 그 반대의 경우 문자를 떨어 뜨린 오래된 직렬 터미널에서만 유용합니다.
  • 신호 : 인터럽트 ( intr, Ctrl+ C), 강제 종료 ( quit, Ctrl+ \), 일시 중단 ( Ctrl+ Z).

Linux를 포함한 일부 시스템은이 목록을 확장하지만 배경을 포함하는 시스템은 본 적이 없습니다. 커널의 터미널 드라이버와 터미널 에뮬레이터에서 모두 지원됩니다. 따라서 일시 중단 작업을 수행해야 전경 작업을 SIGTSTP 신호로 보냅니다 . 포 그라운드 작업 리더의 상위 프로세스 (일반적으로 쉘)에서 SIGCHLD 를 트리거합니다 . 쉘이 SIGCHLD를 받았을 때, 쉘은 waitpid왜 알림을 받았 는지 알아 내고 백그라운드 작업이 일시 중단되었음을 감지하면 알림 (예 🙂 [1] + 12345 suspended mycommand과 새로운 프롬프트를 표시합니다.

SIGCONT포 그라운드 작업에 신호를 보내도록 쉘을 프로그래밍 할 수 있습니다 . zsh에 후크가 있다고 생각하지 않으므로 소스 코드를 패치해야합니다. 그리고 zsh가 실제로 프로그램을 중단시킬 것인지 (이 프로그램이 잘못된 일을 할 수 있습니다, 정렬하는 동안 일시 중단하도록) 또는 배경을 알 수있는 방법이 없습니다.


내가하는 일은 zsh에서 Ctrl+ Z키 시퀀스 를 설정 하여 현재 작업을 백그라운드 로 설정하는 것입니다 ( %%). 이렇게하면 Ctrl+ Z Ctrl+ 를 눌러 전경 작업을 배경으로 보낼 수 있습니다 Z. 내가있는 동안 현재 입력 줄이 비어 있지 않을 때 Ctrl+ Z다른 유용한 것을 수행합니다 (따라서 하위 프로세스에서 돌아 오지 않았습니다) : 현재 입력 줄을“일시 중단”하여 다른 명령을 입력 할 수 있습니다 그 후 중단 된 라인이 입력 버퍼로 다시 푸시됩니다.

fancy-ctrl-z () {
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z

답변

위의 zsh와 같은 ^ z ^ z는 bash에서 가능하지만 약간 혼란스럽고 오랫동안 이것을 실행하지 않았습니다.

  • .inputrc에 매핑을 포함하십시오 "\C-z": "bg\n"
  • PS0 bash 변수에서`$ (stty susp ^ z) ‘를 포함 시키십시오
  • PROMPT_COMMAND bash 변수에 ‘stty susp ^ @’포함

따라서 명령이 실행될 때 suspend에 대한 ^ z가 켜지고 bash 프롬프트에서는 꺼집니다.


답변

그래서 내가 원하는 것이 아니라 여기에서 해결책을 찾았습니다 /superuser//a/161922/35223

빈 명령 줄에서 bg를 실행합니다 (Ctrl + Z Ctrl + Z는 프로그램을 일시 중단하고 즉시 백그라운드에서 다시 시작합니다).


답변

이 명령을 처음에 포 그라운드에서 실행 한 다음 배경으로 전환 하시겠습니까? 더 간단한 방법이 있는지 모르겠습니다. 그러나 백그라운드에서 시작할 명령을 실행하려면 라인 끝에 앰퍼샌드를 추가하면됩니다. 예를 들어 ping google.com &백그라운드에서 핑을 시작합니다. 를 입력하지 않으면 상호 작용할 수 없습니다 fg.