嗨,我向您介绍了一个有关如何设计红眼命令行提示符的小教程。
在某些Linux控制台中工作的每个人都可能会注意到方便的功能,即根据提示行中的位置显示当前文件夹,用户名,服务器名称和其他内容。我也总是喜欢它。但是有时结果却是这样的:
很难在三个字符的行中“创建”,当然,光标会移动到下一行,但是它确实使人恼火,甚至无济于事。在某个时候,我对自己说:
我决定收回所有命令行空间,再也不要将其分配给任何人。问题是如何更改命令提示符文本?事实证明,这非常简单,只需更改特殊系统变量“ PS1”即可。
是的,您可以直接在终端中设置新的邀请文本。但是,如何保存更改?即使没有有关当前目录的信息,您仍然会感到不自在,不断问自己一个问题:“我在哪里?” 〜/ .bashrc文件将帮助您,在其中可以保存PS1更改,并且有关当前目录的信息不会占用工作空间,我决定将其放置在IN而不是OVER命令行中。将以下行添加到〜/ .bashrc文件中:
PS1='$PWD\n# '
注意单引号,如果我们使用双引号,则代替指向$ PWD变量(存储当前文件夹完整路径的系统变量,类似于pwd命令)的指针,其值(当前目录)将写入提示字符串,并在从文件夹移出时更改该文件夹将不会。看起来是这样的:
命令行是完全免费的,但是如果您运行ls命令,则文件夹名称会与内容合并。我们必须将
printf -v line "%${COLUMNS}s"
此命令将创建一个变量$ line并用$ COLUMNS的数量填充空格,但是我们不需要空格,而是使用“-”,为此,我们使用以下技巧:
line=${line// /-} # -
让我们将此代码添加到〜/ .bashrc
printf -v line "%${COLUMNS}s"
line=${line// /-}
PS1='\n$line\n$PWD\n$line\n# '
太好了,但是如果您现在更改终端窗口的大小,“行”的大小将不会更改,并且外观也会消失:
要纠正这种情况,让我们将新代码转移到info函数并将其添加到PS1:
info () {
printf -v line "%${COLUMNS}s"
line=${line// /-}
printf "\n$line\n$PWD\n$line\n# "
}
PS1='$(info)'
您可以通过在顶部定界符中添加主机名的“插入”来将业务与娱乐结合起来。名称中间的插入将在中间,为此,我们需要计算行的中心(考虑到主机名的长度和其他字符):
info () {
name_length="{ $HOSTNAME }"
name_length=${#name_length}
top_line_left=$[(COLUMNS-name_length)/2]
top_line_right=$[COLUMNS-(top_line_left+name_length)]
printf -v top_line "%${top_line_left}s{_S_${HOSTNAME}_S_}%${top_line_right}s"
printf -v bot_line "%${COLUMNS}s"
bot_line=${bot_line// /-}
top_line=${top_line// /-}
top_line=${top_line//_S_/ }
printf "\n$top_line\n$PWD\n$bot_line\n# "
}
PS1='$(info)'
我将主机名用大括号括起来,但使用$“ HOSTNAME ”代替空格,而使用字符“ _S_”,然后将其更改为空格。这是必需的,因为最后一行中的所有空格都用“-”替换,并且空格必须保留在插入内容内。让我们添加颜色,为此,我们将使用代码来准备变量,以更改终端中文本的颜色,我使用了以下颜色:
RED='\e[31m' #
GRN='\e[32m' #
YLW='\e[33m' #
BLU='\e[34m' #
MGN='\e[35m' #
DEF='\e[0m' #
BLD='\e[1m' #
DIM='\e[2m' #
让我们将这些变量添加到我们的代码中:
info () {
name_length="{ $HOSTNAME }"
name_length=${#name_length}
top_line_left=$[(COLUMNS-name_length)/2]
top_line_right=$[COLUMNS-(top_line_left+name_length)]
printf -v top_line "%${top_line_left}s{_S_$DEF$BLD$HOSTNAME${DEF}_S_$GRN}%${top_line_right}s"
printf -v bot_line "%${COLUMNS}s"
bot_line=$GRN${bot_line// /-}$DEF
top_line=${top_line// /-}
top_line=$GRN${top_line//_S_/ }$DEF
printf "\n$top_line\n$BLD$BLU$PWD$DEF\n$bot_line\n# "
}
PS1='$(info)'
继续,右侧看起来是空的,您可以在此处放置日期和时间:
printf -v date "%(%a %d %b %T)T"
要将其放在右边,您需要在$ PWD之后添加一些空格,让我们算一下:
center_space=$[COLUMNS-${#date}-${#PWD}]
((center_space<0)) && center_space=1
...
printf "\n$top_line\n$BLD$BLU$PWD$DEF%${center_space}s$DIM$date\n$bot_line\n# "
你能做得更好吗?当然,如果我们在git项目的文件夹中,请添加git status的输出:
git_tst= git_clr=
[[ -d .git ]] && {
git_tst=($(git status -c color.ui=never -sb))
git_tst="GIT ${git_tst[*]} " #
git_clr=(GIT $(git -c color.ui=always status -sb))
git_clr="GIT ${git_clr[*]} " #
}
...
center_space=$[COLUMNS-${#date}-${#PWD}-${#git_tst}]
...
printf "\n$top_line\n$BLD$BLU$PWD$DEF%${center_space}s$git_clr$DIM$date\n$bot_line\n\$ "
注意,git_clr和git_tst首先被写为数组,然后转换为变量。为了从git status输出中删除换行符,这是必需的。但是眼睛在哪里?现在将有O_o眼睛,让我们创建一个具有一组基本眼睛的数组:
eyes=(O o ∘ ◦ ⍤ ⍥)
让我们计算一下他们的人数:
en=${#eyes[@]}
让我们添加一个嘴巴符号:
mouth='_'
让我们生成一个随机面孔的生成器:
face () {
printf "$YLW${eyes[$[RANDOM%en]]}$mouth${eyes[$[RANDOM%en]]}$DEF"
}
眼睛将位于信息字段的边缘,计算中间的空格数时需要考虑它们,我们将为此准备一个单独的变量:
face_tst='O_o o_O'
...
center_space=$[COLUMNS-${#date}-${#PWD}-${#git_tst}-${#face_tst}]
printf "\n$top_line\n$(face) $BLD$BLU$PWD$DEF%${center_space}s$git_clr$DIM$date $(face)\n$bot_line\n\$ "
如何使你的眼睛脸红?
info () {
error=$?
...
}
让我们 更改一下face函数,以便它检查$错误变量,并根据其值将眼睛涂成红色或黄色:
face () {
[[ $error -gt 0 ]] && ecolor=$RED || ecolor=$YLW
printf "$ecolor${eyes[$[RANDOM%en]]}$YLW$mouth$ecolor${eyes[$[RANDOM%en]]}$DEF"
}
好吧
[[ $debian_chroot ]] && chrt="($debian_chroot)" || chrt=
...
name_length="{ $HOSTNAME$chrt }"
...
printf -v top_line "%${top_line_left}s{_S_$DEF$BLD$HOSTNAME$chrt${DEF}_S_$GRN}%${top_line_right}s"
让我们更改终端窗口标题中的文本:
PS1='$(info)'; case "$TERM" in xterm*|rxvt*) PS1="\[\e]0;$(face 1) \w\a\]$PS1";; esac
标题将显示人脸和当前目录,但是您将需要稍微修改人脸功能,以便它绘制没有颜色代码的人脸,它们将在标题中显示为纯文本,我们将一些参数传递给人脸功能(例如,“ 1”),在函数内部添加一个检查,如果给定第一个参数,则输出未修饰的枪口:
face () {
[[ $error -gt 0 ]] && ecolor=$RED || ecolor=$YLW
[[ $1 ]] && printf "${eyes[$[RANDOM%en]]}$mouth${eyes[$[RANDOM%en]]}" \
|| printf "$ecolor${eyes[$[RANDOM%en]]}$YLW$mouth$ecolor${eyes[$[RANDOM%en]]}$DEF"
}
最终脚本:
RED='\e[31m' #
GRN='\e[32m' #
YLW='\e[33m' #
BLU='\e[34m' #
MGN='\e[35m' #
DEF='\e[0m' #
BLD='\e[1m' #
DIM='\e[2m' #
eyes=(O o ∘ ◦ ⍤ ⍥) en=${#eyes[@]} mouth='_'
face () {
[[ $error -gt 0 ]] && ecolor=$RED || ecolor=$YLW
[[ $1 ]] && printf "${eyes[$[RANDOM%en]]}$mouth${eyes[$[RANDOM%en]]}" \
|| printf "$ecolor${eyes[$[RANDOM%en]]}$YLW$mouth$ecolor${eyes[$[RANDOM%en]]}$DEF"
}
info () { error=$? git_tst= git_clr=
[[ -d .git ]] && {
git_tst=($(git -c color.ui=never status -sb))
git_tst="GIT ${git_tst[*]} " #
git_clr=($(git -c color.ui=always status -sb))
git_clr="GIT ${git_clr[*]} " #
}
[[ $debian_chroot ]] && chrt="($debian_chroot)" || chrt=
name_length="{ $HOSTNAME$chrt }"
name_length=${#name_length}
face_tst='O_o o_O'
top_line_left=$[(COLUMNS-name_length)/2]
top_line_right=$[COLUMNS-(top_line_left+name_length)]
printf -v top_line "%${top_line_left}s{_S_$DEF$BLD$HOSTNAME$chrt${DEF}_S_$GRN}%${top_line_right}s"
printf -v bot_line "%${COLUMNS}s"
printf -v date "%(%a %d %b %T)T"
top_line=${top_line// /-}
top_line=$GRN${top_line//_S_/ }$DEF
bot_line=$GRN${bot_line// /-}$DEF
center_space=$[COLUMNS-${#date}-${#PWD}-${#git_tst}-${#face_tst}]
((center_space<0)) && center_space=1
printf "\n$top_line\n$(face) $BLD$BLU$PWD$DEF%${center_space}s$git_clr$DIM$date $(face)\n$bot_line\n\$ "
}
PS1='$(info)'; case "$TERM" in xterm*|rxvt*) PS1="\[\e]0;$(face 1) \w\a\]$PS1";; esac
仅此而已,谢谢您的关注!)订阅,仅此而已,该项目位于信息栏中github创建,发明,尝试!)
护理检查
"#" "$"?)
(*)(*)