【发布时间】: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 谢谢,可能是这样,它只需要在函数之外。它会使脚本有点难看,但这没什么好担心的。