나는 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
하지만 두 번째 예는 다음과 같습니다.죽일 수 없음또는 ;-)ksh93
zsh
답변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)