通过命令切换 gnome 终端提示符字符串的格式?

通过命令切换 gnome 终端提示符字符串的格式?

我的终端有一个默认的提示格式,如下所示:

用户名@boxname /path/to/current/directory $

生成它的代码如下所示:(它也有一些颜色定义)

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'

如果当前目录的路径太长,使用终端会变得不愉快,因为您会不断换行。在这种情况下,我更喜欢使用产生较短字符串的格式,例如:

用户名@boxname 当前目录名称 $

产生它的代码看起来像这样(再次带有颜色):

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'

有谁知道我如何通过键入例如轻松地将当前终端窗口的格式从一种样式切换到另一种样式:prompttoggle

答案1

PS1用不同的名称存储你的长变量和短变量:

PS1short='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'

确保PS1最初设置为其中之一:

PS1="$PS1long"

然后,您可以创建如下别名来在两个 PS1 值之间切换:

alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'

将所有四行添加到~/.bashrc文件中将使命令在您的 Bash 会话中可用,为了更容易复制,这里再次列出它们:

PS1short='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
PS1="$PS1long"
alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'

答案2

您可以使用一个小bash函数:

prompttoggle () { 
    if [[ $PS1 = *basename* ]]; then 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
    else 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
    fi ;}

上述函数匹配当前是否$PS1包含basename,如果是,则设置PS1不包含basename的,否则设置basename包含的。

将该功能放入您的程序中,~/.bashrc以便它在所有交互式会话中可用。

例子:

foo@bar:~/spam/egg$ prompttoggle () { 
>     if [[ $PS1 = *basename* ]]; then 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
>     else 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
>     fi ;}

foo@bar:~/spam/egg$ prompttoggle 

foo@bar egg $ prompttoggle

foo@bar ~/spam/egg $

答案3

或者...做两个非常微小的功能,并添加到你的末尾~/.bashrc

# short prompt
promptshort() { export PS1=$(echo "$PS1" | sed 's/\\w/\\W/g') ; }

# full length prompt
promptlong() { export PS1=$(echo "$PS1" | sed 's/\\W/\\w/g') ; }

对于缩短的提示符,请键入promptshort,要返回完整路径,请键入promptlong

\W仅显示当前工作目录,所以$(basename ${PWD})在我看来有点过度

您可以将其组合成一个功能,但“长”和“短”具有描述性,并且都比“切换”具有更少的击键次数;)

我更喜欢调整设置它的代码,而不是添加一行来覆盖 PS1(例如,取消注释force_color_prompt=yes并编辑后面的行[ "$color_prompt" = yes ]; then

答案4

这是对您的问题的回答(长目录会破坏命令行),而不是专门针对您的问题(如何动态更改命令提示符)。

几年前我使用这个提示解决了这个问题:

PS1='\[\e[32;1m\]$? \u@\h \[\e[35;1m\]\w\[\e[m\]\n\$ '
#    └──green───┘         └──purple──┘  └─norm─┘

它的作用是:

  1. 输出上一个命令的退出值(这非常有用)
  2. 用一种颜色输出当前用户和主机
  3. 以另一种颜色输出工作目录(根据您的喜好调整颜色)
  4. 在新行上输出美元和空格,在换行符前结束颜色序列

这为您的命令提供了所需的所有空间,当您处于深层目录结构中时不会将其向右移动,不会用颜色代码弄乱输入行(避免有时会发生的奇怪错误),同时仍为您提供有关一个命令的输出结束位置和下一个命令开始位置的彩色提示:

在此处输入图片描述

相关内容