동적으로 생성하는 함수를 사용하고 있습니다 . 폴더가 있는지 확인 하고 노드 버전이나 git 분기를 표시하는 PS1
몇 가지 명령문이 있습니다 . 존재하지 않는 경우 User$만 출력됩니다.node
package.json
git
.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)'
이렇게 하지 않으면 할당 시 함수가 평가됩니다.