我的终端有一个默认的提示格式,如下所示:
用户名@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─┘
它的作用是:
- 输出上一个命令的退出值(这非常有用)
- 用一种颜色输出当前用户和主机
- 以另一种颜色输出工作目录(根据您的喜好调整颜色)
- 在新行上输出美元和空格,在换行符前结束颜色序列
这为您的命令提供了所需的所有空间,当您处于深层目录结构中时不会将其向右移动,不会用颜色代码弄乱输入行(避免有时会发生的奇怪错误),同时仍为您提供有关一个命令的输出结束位置和下一个命令开始位置的彩色提示: