澄清:我希望__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
需要用引号引起来。