PS1 函数中的条件语句不会重新计算

PS1 函数中的条件语句不会重新计算

我正在使用一个函数来动态生成PS1.有几个语句检查是否node存在package.json,以及是否存在git以及.git文件夹是否存在以显示节点版本或 git 分支。如果不存在,则仅输出 User$。

问题是当用户进入另一个不满足任何条件的文件夹时,提示不会更新。就像条件被缓存或其他什么一样

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。 (摆脱命令替换可以在每次更改提示时从子 shell 调用中保存一个分叉。)

答案2

使用引号。

PS1='$(displayPS1)'

如果不这样做,那么该函数将在分配时评估。

相关内容