向自定义函数发送特殊的 bash 字符

向自定义函数发送特殊的 bash 字符

我读了这篇关于自定义 bash 提示符的很棒的文章:

http://blog.superuser.com/2011/09/21/customizing-your-bash-command-prompt/

我还阅读了有关在 bash 中使用 256 种颜色的信息:

http://www.logilab.org/blogentry/20255

现在,我的 .bashrc 如下所示:

# Extended 256 colors
ext-color() {
    echo -ne "\[\033[38;5;$1m\]$2\[\033[m\]"
}

# Set a fancy prompt
PS1="`ext-color 172 \u` in `ext-color 172 $(pwd)`"

这让我差点就看到橙色提示,但用户名并没有被打印出来。相反,它看起来像这样:

u in /home/dave

我该如何修改它以打印当前登录用户的用户名?我的意思是这样:

dave in /home/dave

答案1

它比你想象的要简单得多。当你运行命令时ext-color 172 \u(作为设置 PS1 的一部分或单独运行),shell 会解析\u,删除它认为不相关的\,然后再将其传递给ext-coloras $2。解决方案很简单:在将其传递给 之前将其括在引号中ext-color

PS1="$(ext-color 172 '\u') in $(ext-color 172 '\w')"

(请注意,我还将反引号替换为$( ),用 代替\w$(PWD)'\w'出于与 相同的原因引用'\u'。)

答案2

调整提示第二部分中似乎有效的方法,尝试例如:

PS1="`ext-color 172 $(whoami)` in `ext-color 172 $(pwd)`"

或者更简单:

PS1="`ext-color 172 $USER` in `ext-color 172 $(pwd)`"

或者更棒的是:

PS1="$(ext-color 172 "$USER") in $(ext-color 172 "$(pwd)")"

由于调用周围有引号,最后一个版本不会截断当前目录中潜在空格后的部分pwd


编辑:这不会更新工作目录,如评论中所述。我甚至没有想到这一点,因为这个问题专门询问了用户部分(现在已经很晚了 :-) )。

最简单(“正确”、“唯一”)的方法就是写

PS1='\[\033[38;5;172m\]\u\[\033[m\] in \[\033[38;5;172m\]\w\[\033[m\]'

并完全跳过函数定义。


扩张:为了使PS1变量动态扩展函数调用,请使用反斜杠来阻止过早评估:

PS1="$(ext-color 172 "\$USER") in $(ext-color 172 "\$PWD")"

应该管用。

相关内容