아래쪽 화살표를 누르면 터미널 라인의 일부가 사라집니다.

아래쪽 화살표를 누르면 터미널 라인의 일부가 사라집니다.

나는 사용자 정의 PS1을 사용하여 내 터미널에 내가 git 디렉토리에 있는지, 디렉토리가 깨끗하거나 변경 사항을 커밋해야 하는지 등 더 관련성 있는 정보를 표시합니다. 그러나 때때로 명령을 화살표로 이동할 때 터미널 줄의 일부가 사라집니다.

@ ~/tests/testing [tests] > grunt
# up arrow, down arrow
@ ~/tests/testing [t

본질적으로 ests] >은 잘리고 [t.

이 PS1 구성에서 선의 일부가 잘리는 특별한 이유가 있습니까?

추가 정보는 다음과 같습니다.

내 TERM 환경 변수는 입니다 xterm-256color. 내 내용은 다음과 같습니다 .bash_profile.

red='\033[0;31m'
yellow='\033[0;32m'
orange='\033[0;33m'
blue='\033[0;34m'
pink='\033[0;35m'
NC='\033[0m'

function is_git {
  if git rev-parse --is-inside-work-tree 2>/dev/null; then
    return 1
  else
    return 0
  fi
}

function stuff {
  if [ $(is_git) ]; then
    git_dir="$(git rev-parse --git-dir 2>/dev/null)"

    if [ -z "$(ls -A ${git_dir}/refs/heads )" ]; then
      echo -en " [${orange}init${NC}]"
      return
    fi

    echo -n " ["
    if [ $(git status --porcelain 2>/dev/null| wc -l | tr -d ' ') -ne 0 ]; then
      echo -en "${red}"
    else
      echo -en "${blue}"
    fi
    echo -en "$(git rev-parse --abbrev-ref HEAD)${NC}]"
  fi
}

export PS1="@ \w\[\$(stuff)\]\[\$(tput sgr0)\] > "

답변1

and 등 의 정의 안에 \[and 를 넣으라는 @i_am_root의 제안은 좋은 것입니다. 그러나 당\]red이것, bash는 에 포함된 텍스트가 아닌 에서만 프로세스 \[및 를 처리합니다 . 따라서 and 대신 and 등 내부의 and (또는 and )를 사용하세요 .\]PS1PS1$()\001\002\x01\x02red\[\]

참고: 당이 답변\001, 및 에는 이스케이프 코드만 있어야 합니다 \002. 사용자에게 표시되는 텍스트는 외부에 있어야 하며 \001bash \002가 이를 인식하여 화면 공간을 차지하고 다시 그릴 때 이를 고려할 수 있도록 해야 합니다.

답변2

Bash 색상 코드, 이스케이프 문자, 할당 등은 빠르게 혼란스러워집니다.

echo변수 에 추가하여 명령을 대체하는 이 코드 샘플을 사용해 보세요 PS1.

red='\[\033[0;31m\]'
yellow='\[\033[0;32m\]'
orange='\[\033[0;33m\]'
blue='\[\033[0;34m\]'
pink='\[\033[0;35m\]'
NC='\[\033[0m\]'

export PS1="@ \w"

function is_git {
  if git rev-parse --is-inside-work-tree 2>/dev/null; then
    return 1
  else
    return 0
  fi
}

function stuff {
  if [ $(is_git) ]; then
    git_dir="$(git rev-parse --git-dir 2>/dev/null)"

    if [ -z "$(ls -A ${git_dir}/refs/heads )" ]; then
      PS1="${PS1} [${orange}init${NC}]"
      return
    fi

    PS1="$PS1 ["
    if [ $(git status --porcelain 2>/dev/null| wc -l | tr -d ' ') -ne 0 ]; then
      PS1="${PS1}${red}"
    else
      PS1="${PS1}${blue}"
    fi
    PS1="${PS1}$(git rev-parse --abbrev-ref HEAD)${NC}]"
  fi
}

stuff
PS1="${PS1}$(tput sgr0) > "

관련 정보