내 프롬프트에는 현재 디렉터리의 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 3
bash를 다시 실행해 보세요.
같은 상황:
$ 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]
그리고-t
bashrc를 우회할 것입니다(시도해본 적은 없습니다)ssh [email protected] bash --noprofile --norc
더 안전할 것 같네요(해보지는 않았습니다)