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


9

我的终端具有这样的默认提示格式:

username @ boxname / path / to / current / directory $

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

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

如果当前目录的路径太长,则由于不停地换行,使它不适用于终端。在这种情况下,我更喜欢一种格式,它可以产生像这样的较短字符串:

username @ boxname current_dir_name $

产生它的代码如下所示(再次使用颜色):

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

有谁知道我如何仅通过键入以下内容就可以轻松地将当前终端窗口的格式从一种样式切换为另一种样式prompttoggle


6
您知道bash的PROMPT_DIRTRIM参数吗?
steeldriver

@steeldriver直到现在。之间的切换PROMPT_DIRTRIM=0,并PROMPT_DIRTRIM=1似乎比不同的价值观之间的切换更简单PS1,结果几乎是一样的。谢谢(你的)信息!
Rotareti

使用PROMPT_DIRTRIM一个也可以向命令添加参数。如果不传递任何参数,则在PROMPT_DIRTRIM=0和之间切换PROMPT_DIRTRIM=1,如果将数字作为参数传递PROMPT_DIRTRIM,则将其设置为它。promptlen则该命令将是一个更合适的名称。
Rotareti

Answers:


10

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'

7

您可以使用一个微型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 $

5

或者...做两个非常小的功能,然后添加到您的末尾~/.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})的恕我直言

您可以组合成一个函数,但是“ long”和“ short”是描述性的,并且两次击键的次数都少于“ toggle”;)

与其添加一行覆盖PS1的方法,我不如对其进行设置的代码进行调整(例如,取消注释force_color_prompt=yes并在之后编辑该行[ "$color_prompt" = yes ]; then



1

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

我几年前通过以下提示解决了这个问题:

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

这是做什么的:

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

这为您提供了命令所需的所有空间,当您处于深层目录结构中时不会将其右移,不会用颜色代码来打乱输入行(避免有时会发生奇怪的错误),同时仍然为您提供颜色提示一个命令的输出在哪里结束,下一个命令的输出在哪里:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.