【问题标题】:Bash prompt variables does not work inside a bash functionbash 提示变量在 bash 函数中不起作用
【发布时间】:2021-06-23 13:08:54
【问题描述】:

我正在进行提示自定义,但由于某种原因,当我使用 \u\h\W 变量时,它可以正常工作,但是当我将它们放在一个函数中时,它们是显示为“\u”或“\W”而不是它们的值。

...

print_user()
{
  echo -e "\001\u\002@\001\h\002"
}

print_dir()
{
  echo -e "\001${YELLOW}\002\001\W\002\001${RESET_ATTR}\002"
}

PS1='[$(print_user) on $(print_dir)] $(get_git_repo) \001\n\002$(print_prompt) '

这显示为:

[\u@\h on \W]
>

如果我像这样将它们移到函数之外

PS1='[\[\u\]@\[\h\] \[${YELLOW}\]\[\w\]\[${RESET_ATTR}\]] $(get_git_repo) \[\n\]$(print_prompt)'

它工作正常,并显示带有用户名和主机名的当前目录:

[myusername@arch on ~]
>

这就是 bash 的工作原理吗?有没有不同的方法可以做到这一点?为什么在函数内部不显示变量的值,而在函数外部显示?

【问题讨论】:

  • 我的猜测是命令替换是在提示符转义后评估的,所以当 print_user 产生它的输出时,用当前用户名替换 \u 为时已晚。
  • @MarcusMüller 这是故意的,以便在每次显示提示时评估命令变电站,而不是在定义提示字符串时。
  • @chepner 'doh,你是对的!今天是我不太开心的一天。
  • @chepner 谢谢,可能是这样,它只需要在函数之外。它会使脚本有点难看,但这没什么好担心的。

标签: linux bash prompt


【解决方案1】:

来自手册页,在 PROMPTING

Bash 允许通过插入一些 反斜杠转义的特殊字符,解码如下:

[...]

字符串解码后,通过参数扩展、命令替换、算术扩展和引号去除,以 promptvars shell 选项(参见下面 SHELL BUILTIN COMMANDS 下 shopt 命令的说明)。

当 shell 扩展 $(print_user) 以将 \u 添加到字符串时,已经来不及解码它了,所以文字字符串 \u 保留在提示符中。

另一种方法是使用PROMPT_COMMAND 来执行一个函数,该函数在显示之前动态定义PS1,而不是在PS1 本身的值中嵌入命令替换。

make_prompt () {
  PS1="[$(print_user) on $(print_dir)] $(get_git_repo)"
  PS1+='\[\n\]'
  PS1+="$(print_prompt) "
}

PROMPT_COMMAND=make_prompt

现在,print_user 将在 shell 解码 PS1 的值之前被调用,此时所有提示转义都将出现。

【讨论】:

  • 是的,听起来确实如此。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多