PS1 함수의 조건문은 재평가되지 않습니다.

PS1 함수의 조건문은 재평가되지 않습니다.

동적으로 생성하는 함수를 사용하고 있습니다 . 폴더가 있는지 확인 하고 노드 버전이나 git 분기를 표시하는 PS1몇 가지 명령문이 있습니다 . 존재하지 않는 경우 User$만 출력됩니다.nodepackage.jsongit.git

문제는 사용자가 어떤 조건도 충족하지 않는 다른 폴더로 이동하면 프롬프트가 업데이트되지 않는다는 것입니다. 조건이 캐시된 것처럼

function displayPS1() {
  MESSAGE="";
  GRAY_BACK="\[\e[100;97m\]";
  GREEN_BACK="\[\e[100;42m\]";
  GREEN_FORE="\[\e[32;1m\]";
  CYAN_BACK="\[\e[100;46m\]";
  CYAN_FORE="\[\e[36;1m\]";
  RESET="\[\e[0m\]";

  if hash node 2>/dev/null && [ -e package.json ]; then
    NODE='$(node -v | sed "s/\(v[0-9]*\)\(\.[0-9]*\.[0-9]*\)/\1/g")';
    MESSAGE="${GRAY_BACK} node ${GREEN_BACK} $NODE ${RESET} User${GREEN_FORE}$ ${RESET}";
  elif hash git 2>/dev/null && [ -d .git ]; then
    BRANCH='$(cat .git/HEAD | sed "s/ref:[[:space:]]refs\/heads\///")';
    MESSAGE="${GRAY_BACK} git ${CYAN_BACK} $BRANCH ${RESET} User${CYAN_FORE}$ ${RESET}";
  else
    MESSAGE="User${CYAN_FORE}$ ${RESET}";
  fi

  echo "$MESSAGE";
}
export PS1=$(displayPS1);

답변1

export PS1=$(displayPS1);

이것이 실행 displayPS1되고 if그 안에 있는 명령문이한 번, 결과를 프롬프트에 할당합니다. 조건이 다시 처리되지 않습니다.

PROMPT_COMMAND대신 프롬프트가 인쇄될 때마다 호출되도록 함수 호출을 넣으세요 . 그래서 어느 쪽이든

PROMPT_COMMAND='PS1=$(displayPS1)'

아니면 더 정확하게는

PROMPT_COMMAND=setPS1

그리고 setPS1자신을 설정하는 함수를 만듭니다 PS1. (명령 대체를 제거하면 프롬프트가 변경될 때마다 하위 쉘 호출에서 포크가 저장됩니다.)

답변2

따옴표를 사용하세요.

PS1='$(displayPS1)'

이렇게 하지 않으면 할당 시 함수가 평가됩니다.

관련 정보