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)'

そうしないと、割り当て時に関数が評価されます。

関連情報