使用从 pwd 派生的动态文本编辑终端提示

Editing Terminal promt with dynamic text derived from pwd

简短版

使用这个提示得到这个绿色:

这一行:

export PS1="\w: \[$(tput setaf 2)\][GREEN]\[$(tput sgr 0)\] $ "

但是要在函数内部工作所以

my_function(){
  echo -e "\[$(tput setaf 2)\][GREEN]\[$(tput sgr 0)\]"
  # echo "\[$(tput setaf 2)\][GREEN]\[$(tput sgr 0)\]"
}
export PS1="\w: $(my_function) $ "

不幸的是我得到这个提示:~/Work/temp/prompt_test: \[\][GREEN]\[\] $

*您不能使用 $(my_function) 而不是 $(my_function) - 为什么?下面详细解释。

详细说明

我正在尝试满足 2 个条件:

条件一

我可以用这段代码给提示添加颜色:

export PS1="\w: $(tput setaf 2)GREEN$(tput sgr 0) $ "

但是如果我输入一个长命令,然后单击 home + end- 事情变得一团糟 - 复制行为:

  1. export PS1="\w: $(tput setaf 2)GREEN$(tput sgr 0) $ "
  2. 键入一个长命令(无回车):longg command with many charterssssssssssssssssssssssssssssssssssssss
  3. 点击home
  4. 点击end
  5. 尝试使用 backspace
  6. 删除所有字符

我可以修复在 color commands 之前和之后添加 \[\]:

export PS1="\w: \[$(tput setaf 2)\]GREEN\[$(tput sgr 0)\] $ "

问题解决了。 让我们调用“防止那个问题”条件 1

条件 2

让 PS1 行在每次目录更改时 动态地 求值。 所以给出以下结构(基本上制作两个文件夹:mkdir blue red) 两个文件夹:
+-- 红色
+-- 蓝色

然后是一个简单的 bash 函数来检查 pwd 是否包含 bluered 然后添加颜色以提示所以每当我更改为 [=30= 的文件夹时] 我得到的路径 blue,与 red

相同
change_color2(){
  local my_pwd=$(pwd)
  if [[ $my_pwd == *"blue"* ]]; then # path containing 'blue'
    echo "$(tput setaf 4)<BLUE>$(tput sgr 0)"
  elif [[ $my_pwd == *"red"* ]]; then # path containing 'red'
    echo "$(tput setaf 1)<RED>$(tput sgr 0)"
  fi
}
export PS1="\w: $(change_color2) $ "
cd red
cd blue

请注意,如果我使用 $(change_color2) 而不是 $(change_color2)

,这将不起作用

我想同时满足这两个条件,但我做不到 - 你能帮忙吗? 谢谢。

Ubuntu 20.04 /bin/bash

正如 pynexj 在他的回答中提到的 This Answer 解决方案是使用 PROMPT_COMMAND 这是一个在 PS1.

之前被评估的函数

所以我能做到

my_function(){
  echo -e "\[$(tput setaf 2)\][GREEN]\[$(tput sgr 0)\]"
  # echo "\[$(tput setaf 2)\][GREEN]\[$(tput sgr 0)\]"
}
update_PS1 () {
  PS1="\w: $(my_function) $ "
}
PROMPT_COMMAND=update_PS1
# export PS1="\w: $(my_function) $ "

这次在 update_PS1 中我使用的是 $(my_function),而不是 $(my_function) 但没关系 - 由于使用 PROMPT_COMMAND PS 每次更改新文件夹时都会评估变量。