红眼睛





嗨,我向您介绍了一个有关如何设计红眼命令行提示符的小教程。



在某些Linux控制台中工作的每个人都可能会注意到方便的功能,即根据提示行中的位置显示当前文件夹,用户名,服务器名称和其他内容。我也总是喜欢它。但是有时结果却是这样的:







很难在三个字符的行中“创建”,当然,光标会移动到下一行,但是它确实使人恼火,甚至无济于事。在某个时候,我对自己说:







我决定收回所有命令行空间,再也不要将其分配给任何人。问题是如何更改命令提示符文本?事实证明,这非常简单,只需更改特殊系统变量“ PS1”即可。







是的,您可以直接在终端中设置新的邀请文本。但是,如何保存更改?即使没有有关当前目录的信息,您仍然会感到不自在,不断问自己一个问题:“我在哪里?” 〜/ .bashrc文件将帮助您,在其中可以保存PS1更改,并且有关当前目录的信息不会占用工作空间,我决定将其放置在IN而不是OVER命令行中。将以下行添加〜/ .bashrc文件中:



PS1='$PWD\n# '


注意单引号,如果我们使用双引号,则代替指向$ PWD变量(存储当前文件夹完整路径的系统变量,类似于pwd命令)的指针,其值(当前目录)将写入提示字符串,并在从文件夹移出时更改该文件夹将不会。看起来是这样的:







命令行是完全免费的,但是如果您运行ls命令,则文件夹名称会与内容合并。我们必须将果蝇与肉饼分开将文件夹名称与内容分开。我决定通过在顶部和底部添加“-”行来为$ PWD添加“框架” 。如何找出字符串中的字符数为此,还有系统变量$ COLUMNS。... 要快速形成带有所需数量的“-”字符的字符串,请使用printf命令



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_clrgit_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\$ "






如何使你的眼睛脸红?坐在计算机上很长时间,没有睡觉。stackoverflow.com上,我遇到一个有趣的问题,作者问:“如果最后一条命令失败,如何将命令行提示符中的颜色更改为红色?” 这使我想到了红眼睛的想法。让我们添加到info函数中,以记住最后一条命令的完成状态:



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变量添加一个检查



[[ $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创建,发明,尝试!)



护理检查
"#" "$"?)



(*)(*)



All Articles