쉘의 프롬프트에서 명령 실행을 중지하는 방법은 무엇입니까?

쉘의 프롬프트에서 명령 실행을 중지하는 방법은 무엇입니까?

내 프롬프트에는 현재 디렉터리의 git repo에 대한 일부 정보가 포함되어 있습니다. 내가 뭔가를 할 때 cd, 내 쉘은 어떤 명령(예: git status)을 실행합니다.

동일한 터미널을 통해 이러한 명령 실행을 중지하는 방법이 있습니까? 키보드에서 신호 보내기(예: Ctrl+ 를 통해 c)가 작동하지 않습니다.

업데이트 #1

나는 이 명령을 영구적으로 비활성화하고 싶지 않습니다. 단지 명령이 실행을 시작한 다음 실행되는 동안 중지하기를 원합니다.

답변1

이러한 명령은 특정 형태의 셸의 하위 프로세스입니다. pstree -p $$현재 쉘에서 실행 중인 프로세스를 나열하는 경우 . 그런 다음 Ctrl-C(SIGINT)와 동일한 종료 명령을 실행할 수 있습니다. 이는 수동 백그라운드 명령의 예이지만 프롬프트 업데이트에도 동일해야 합니다. 설명하자면 $$pstree는 쉘 프로세스 ID를 대체하고 pstree는 상위/하위 관계의 모든 프로세스를 표시하며 -p 옵션은 이를 현재 쉘로 제한합니다. 물론 쉘 pid를 죽이지 말고, 죽이고 싶은 아이들만 죽이십시오.

$ find / 2> /dev/null > /dev/null &
[1] 916595
$ pstree -p $$
bash(915332)─┬─find(916595)
             └─pstree(916598)
$ kill 916595
[1]+  Terminated              find / 2> /dev/null > /dev/null
$
`

답변2

이렇게 하면:

PS1='$(set -x; sleep 3; echo STATUS)$ '

이것이 효과가 있다는 것을 알게 될 것입니다 ^C. 프롬프트를 다시 그리고 sleep 3bash를 다시 실행해 보세요.

같은 상황:

$ PROMPT_COMMAND='git_status=$(set -x; sleep 3; echo STATUS)' PS1='$git_status$ '

이 문제는 다음을 통해 해결될 수 있습니다.

PROMPT_COMMAND='
  interrupted=0
  trap interrupted=1 INT QUIT
  git_status=$(set -x; sleep 3; echo STATUS)
  trap - INT QUIT
  if (( interrupted )); then
    git_status+="<INTERRUPTED>"
  fi'
PS1='$git_status$ '

SIGINT에 핸들러를 추가합니다. 신호가 처리되고 $PROMPT_COMMAND정상적으로 완료되면 bash는 프롬프트를 다시 그리지 않습니다. 명령이 중단되었다는 메시지에 정보를 추가할 수도 있습니다.

set -x; sleep 3; echo STATUS여기서 예제 자리 표시자로 사용된 것을 자리 표시자 또는 이에 상응하는 것으로 바꿀 수 있습니다 git status.


zsh에서는 다음 명령을 사용하여 유사하고 깔끔한 작업을 수행할 수 있습니다.

precmd() {
  set -o localoptions -o localtraps
  local interrupted=0
  trap interrupted=1 INT QUIT
  psvar[1]=$(set -x; sleep 3; echo STATUS)
  if (( interrupted )) psvar[1]+='<INTERRUPTED>'
}
PS1='%1v$ '

답변3

bash를 사용하고 있습니까(보려면 에코 $0)? cd다른 항목(try unalias cd또는 )에 대한 별칭이 없으면 unset cd셸 시작 시 무언가가 이 동작을 일으키는 것으로 의심됩니다. Bash에서는 .profile, .bashrc 또는 시스템 bashrc에 있을 수 있습니다. 존재하다뿌리--noprofile --norc, 상자에 SSH로 연결하거나 기존 터미널에서 새 터미널을 호출할 때 사용하는 것이 좋습니다 . 그래서,

  • Bash를 호출하여 시작하세요. sh.bashrc는 필요하지 않습니다. "오류" 터미널 세션에서 이 작업을 수행할 수 있습니다.
  • ssh -t [email protected]그리고 -tbashrc를 우회할 것입니다(시도해본 적은 없습니다)
  • ssh [email protected] bash --noprofile --norc더 안전할 것 같네요(해보지는 않았습니다)

관련 정보