彩色 PS1 琴弦

彩色 PS1 琴弦

澄清:我希望__foo每次在终端中显示 PS1 字符串时都执行,而不是在构造 PS1 字符串时执行(因此它放在引号中)。__foo包含检查当前目录的逻辑,因此必须推迟其执行。


我正在尝试在 Bash 函数中使用 Bash PS1 字符串中的不同颜色:

LIGHTRED="\033[1;31m"
LIGHTGREEN="\033[1;32m"
RESET="\033[m"

__foo () {
    # Do some stuff and genereate a string to echo in different colours:
    echo -n '\['$1'\]firstcolour \['$2'\]secondcolour'
}

PS1='$(__foo '$LIGHTRED' '$LIGHTGREEN')\['$RESET'\] \$'

本质上,我想__foo用多种不同的颜色生成 PS1 的一部分。但我的尝试似乎没有成功;它产生了以下输出:

-bash: 31m: command not found
-bash: 32m: command not found
\[]firstcolour \[\]secondcolour $

发生了什么事?我该如何解决?

答案1

使用 Bash 环境变量$PROMPT_COMMAND重新定义$PS1显示提示之前变量。

LIGHTRED='\033[1;31m'
LIGHTGREEN='\033[1;32m'
RESET='\033[m'

__foo () {
  # Do some stuff and genereate a string to echo in different colours:
  echo -n "\[$1\]firstcolour \[$2\]secondcolour"
}

PROMPT_COMMAND=$PROMPT_COMMAND'; PS1="$(__foo $RED $GRN)\[$RESET\]\n\$ "'

请注意,我对代码所做的另外两项更改在此处是可选的。之所以添加它们,是因为我认为它们可以明确转义代码在何处扩展/未扩展:

  • '围绕颜色定义变量的硬引号。
  • "返回字符串的软引号__foo

答案2

您的函数foo返回一个字符串,该字符串由 bash 作为命令执行,因为您用它包围了它$()(并用单引号转义了所有变量替换。

将您的代码更改为以下内容可以使其正常工作:

LIGHTRED="\033[1;31m"
LIGHTGREEN="\033[1;32m"
RESET="\033[m"

__foo () {
  # Do some stuff and genereate a string to echo in different colours:
  echo -n '\['$1'\]firstcolour \['$2'\]secondcolour'
}

PS1=$(__foo $LIGHTRED $LIGHTGREEN)\[$RESET\]\$

答案3

我已经解决了:

LIGHTRED="\033[1;31m"
LIGHTGREEN="\033[1;32m"
RESET="\033[m"

__foo () {
    # Do some stuff and genereate a string to echo in different colours:
    echo -n '\['$1'\]firstcolour \['$2'\]secondcolour'
}

PS1='$(__foo "'$LIGHTRED'" "'$LIGHTGREEN'")\['$RESET'\] \$'

参数__foo需要用引号引起来。

相关内容