SIGTSTP에 의해 중단된 명령 편집 및 실행

SIGTSTP에 의해 중단된 명령 편집 및 실행

나는 bash를 사용해 왔습니다.edit-and-execute-command기능:

edit-and-execute-command (C-x C-e)

현재 명령줄에서 편집기를 호출하고 결과를 셸 명령으로 실행합니다. Bash는 $VISUAL, $EDITOR및 편집기를 순서대로 호출하려고 시도합니다 .emacs

https://www.gnu.org/software/bash/manual/html_node/Miscellaneous-Commands.html

편집기를 호출하고 Ctrl-Z를 사용하여 배경에 넣은 다음 다시 fg전경으로 가져오면 쉘이 더 이상 임시 파일을 실행하지 않는다는 것을 알았습니다.

명령을 중단하고 싶을 때 이 기능이 편리하지만 처음 발생할 때 이 동작이 다소 놀랍습니다.

내 질문:

  • 왜 이런 일이 발생합니까?

    소스코드를 통해 알아요edit_and_execute_command최종 호출fc, 하지만 모르겠어요 SIGTSTP를 보내면 bash가 임시 파일을 실행하는 것을 방지할 수 있습니다.

  • 실수로 Ctrl-Z를 눌렀는데 여전히 편집기에 열린 임시 파일에서 스크립트를 실행하려는 경우 가장 좋은 방법은 무엇입니까?

답변1

실수로 클릭했는데 편집기가 열려 있는 상태에서 임시 파일의 스크립트를 계속 실행하려는 경우 Ctrl-Z가장 좋은 방법은 무엇입니까 ?

편집기 래퍼를 사용하여 마지막 명령을 어딘가에 저장하고 readline 바인딩을 사용하여 복원할 수 있습니다. 마지막 버퍼를 저장 ~/.last_fcedit하고 바인딩 Esc-/( Alt-/)하여 명령줄을 바꾸는 예:

LAST_FCEDIT=$HOME/.last_fcedit
fc(){ case $1 in -e) _fce=$2; set -- "$@" -e _fcedit; esac; command fc "$@"; }
_fcedit()("$_fce" "$@"; s=$?; test -f "$1" && mv "$1" "$LAST_FCEDIT"; exit "$s")
bind -x '"\e/":READLINE_LINE=$(<"$LAST_FCEDIT")'

그 다음에

$ echo FOO<Ctrl-X Ctrl-E>
... in editor ...
<Ctrl-Z>
[1]+  Stopped                 ( "$_fce" "$@"; s=$?; mv "$1" "$LAST_FCEDIT"; exit "$s" )
$ fg<Enter>
... edit FOO to BAR and exit the editor ...
( "$_fce" "$@"; s=$?; mv "$1" "$LAST_FCEDIT"; exit "$s" )
$ <Alt-/>echo BAR<Enter>
BAR

왜 이런 일이 발생합니까?

못찾 겠어요설득력 있는fc기본 사항이지만 확인할 수 있는 모든 셸 구현의 일반(및 관련 키 바인딩)과 동일합니다.

내 생각에는 이것이 쉘이 뒤로 또는 전경으로 재귀할 수 없는 것과 관련이 있다고 생각합니다.그 자체, 하위 작업(프로세스 그룹)만 가능합니다. 당신도 같은 것을 발견할 수 있습니다:

$ foo(){ cat; echo DONE; }
$ foo
^Z
[1]+  Stopped                 cat
DONE  # but cat is still running!
$ fg
cat
^D
$

또는

$ foo=$(cat)
^Z^Z^Z^Z^Z^Z # no way to suspend it!

와 달리 bash첫 번째 예는 실제로 ksh93또는 에서 "작동" zsh하지만 두 번째 예는 다음과 같습니다.죽일 수 없음또는 ;-)ksh93zsh

답변2

Ctrl-Z트리거 SIGTSTP, 참조https://stackoverflow.com/questions/11886812/whats-the-difference-Between-sigstop-and-sigtstp/11888074. SIGTSTP프로세스를 일시 중지합니다.

사실: Linux 프로그래머라면 Ctrl-Z를 사용하여 셸에서 실행 중인 프로세스를 종료하지 않고 중단하면 SIGTSTP가 발생합니다. 이로 인해 일반적으로 쉘이 해당 작업을 보류 중인 작업 목록에 넣습니다.

단순 사용자첫 번째 답변 아래에 댓글 달기https://stackoverflow.com/questions/11886812/whats-the-difference-Between-sigstop-and-sigtstp/11888074

프로세스가 일시 중단되는 이유 SIGTSTP는 이것이 커널에 정의되어 SIGTSTP프로세스를 일시 중단하기 때문입니다(http://man7.org/linux/man-pages/man7/signal.7.html)

관련 정보