les yeux rouges





Salut, je présente à votre attention un petit tutoriel sur la façon de concevoir une invite de ligne de commande avec un œil rouge.



Tous ceux qui ont travaillé dans la console de certains Linux ont probablement noté la fonctionnalité pratique d'afficher le dossier actuel, le nom d'utilisateur, le nom du serveur et autre chose en fonction de la distra dans la ligne d'invite. J'ai toujours aimé ça aussi. Mais parfois, cela s'est avéré comme ceci:







Il est difficile de "créer" dans une ligne de trois caractères, bien sûr, le curseur se déplace sur la ligne suivante, mais cela exaspère plus qu'il n'aide. Et à un moment donné, je me suis dit:







j'ai décidé de reprendre tout l'espace de la ligne de commande et de ne plus jamais le donner à personne. La question était de savoir comment modifier le texte de l'invite de commande? Cela s'est avéré très simple, il suffit de changer la variable système spéciale `PS1`.







Oui, vous pouvez définir un nouveau texte d'invitation directement dans le terminal. Mais comment enregistrer les modifications? Et même sans informations sur le catalogue actuel, vous vous sentez mal à l'aise, vous vous posant constamment la question: "Où suis-je?" Le fichier ~ / .bashrc vous aidera , vous pourrez y enregistrer le changement PS1, et pour que les informations sur le répertoire actuel n'occupent pas l'espace de travail, j'ai décidé de le placer non pas DANS mais SUR la ligne de commande. Ajoutez la ligne suivante au fichier ~ / .bashrc :



PS1='$PWD\n# '


Faites attention aux guillemets simples, si nous utilisons des guillemets doubles, alors au lieu d'un pointeur vers la variable $ PWD (une variable système qui stocke le chemin complet du dossier actuel, analogue à la commande pwd) , sa valeur (répertoire actuel) sera écrite dans la chaîne d'invite et modifiée lors du déplacement du dossier le dossier ne sera pas. Cela ressemble à ceci: La







ligne de commande est entièrement gratuite, mais le nom du dossier fusionne avec le contenu si vous exécutez la commande ls . Nous devrons séparer les mouches des côtelettes, le nom du dossier du contenu. J'ai décidé d'ajouter des "frames" pour $ PWD en ajoutant des lignes "-" en haut et en bas. Comment connaître le nombre de caractères dans une chaîne? Il existe également la variable système $ COLUMNS pour cela.... Et pour former rapidement une chaîne avec le nombre requis de caractères "-", utilisez la commande printf :



printf -v line "%${COLUMNS}s"


Cette commande créera une variable $ line et la remplira d'espaces d'un montant de $ COLUMNS mais nous n'avons pas besoin d'espaces mais de "-", pour cela nous utilisons l'astuce suivante:



line=${line// /-} #     -


Ajoutons ce code à ~ / .bashrc



printf -v line "%${COLUMNS}s"
line=${line// /-}
PS1='\n$line\n$PWD\n$line\n# '






Génial, mais si nous changeons la taille de la fenêtre du terminal maintenant, la taille des "lignes" ne changera pas et la beauté disparaîtra:







pour corriger la situation, nous transférerons le nouveau code vers la fonction info et l'ajouterons à PS1:



info () {
    printf -v line "%${COLUMNS}s"
    line=${line// /-}
    printf "\n$line\n$PWD\n$line\n# "
}
PS1='$(info)'


Vous pouvez combiner l'utile à l'agréable en ajoutant un "insert" avec le nom d'hôte au délimiteur supérieur. L'insert avec le nom sera au milieu, pour cela, nous devons calculer le centre de la ligne (en tenant compte de la longueur du nom d'hôte et des caractères supplémentaires):



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)'






J'ai inclus le nom d'hôte entre accolades avec des espaces, mais au lieu d'espaces autour de $ HOSTNAME , "_S_" est utilisé, qui est ensuite changé en espaces. Ceci est nécessaire car tous les espaces de la dernière ligne sont remplacés par "-" et les espaces doivent rester à l'intérieur de l'insert. Ajoutons des couleurs, pour cela nous préparerons des variables avec des codes pour changer la couleur du texte dans le terminal, j'ai utilisé les couleurs suivantes:



RED='\e[31m' # 
GRN='\e[32m' # 
YLW='\e[33m' # 
BLU='\e[34m' # 
MGN='\e[35m' # 
DEF='\e[0m'  #    
BLD='\e[1m'  # 
DIM='\e[2m'  # 


Ajoutons ces variables à notre code:



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)'






Allez-y, le côté droit semble vide, vous pouvez y mettre la date et l'heure:



printf -v date "%(%a %d %b %T)T"


Pour placer ceci à droite, vous devez ajouter un certain nombre d'espaces après $ PWD , quoi, comptons:



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# "






Pouvez-vous faire mieux? Bien sûr, ajoutons la sortie de git status si nous sommes dans le dossier avec le projet git :



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






Notez que git_clr et git_tst sont d' abord écrits sous forme de tableau puis convertis en variables. Cela est nécessaire pour supprimer les sauts de ligne de la sortie d' état de git . Mais où sont les yeux? Maintenant, il y aura des yeux O_o, créons un tableau avec un ensemble d'yeux de base:



eyes=(O o ∘ ◦ ⍤ ⍥)


Et comptons leur nombre:



en=${#eyes[@]}


Ajoutons un symbole de bouche:



mouth='_'


Et faisons un générateur de faces aléatoires:



face () {
    printf "$YLW${eyes[$[RANDOM%en]]}$mouth${eyes[$[RANDOM%en]]}$DEF"
}


Les yeux seront situés sur les bords du champ d'informations, vous devez les prendre en compte lors du calcul du nombre d'espaces au milieu, nous préparerons une variable séparée pour cela:



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






Comment faire rougir vos yeux? Assis à l'ordinateur pendant une longue période, sans dormir. Sur stackoverflow.com, je suis tombé sur une question intéressante , l'auteur demande: "Comment changer la couleur de l'invite de ligne de commande en rouge si la dernière commande échoue?" Cela m'a conduit à l'idée des yeux rouges. Ajoutons à la fonction info en mémorisant l'état d'achèvement de la dernière commande:



info () {
    error=$?
    ...
}


Et changeons la fonction de visage pour qu'elle vérifie la variable $ error et, en fonction de sa valeur, peint les yeux en rouge ou en jaune:



face () {
    [[ $error -gt 0 ]] && ecolor=$RED || ecolor=$YLW
    printf "$ecolor${eyes[$[RANDOM%en]]}$YLW$mouth$ecolor${eyes[$[RANDOM%en]]}$DEF"
}






Eh bien , mes yeux sont devenus rouges, mais vous pouvez ajouter autre chose. Ajoutons un contrôle pour la variable $ 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"


Et changeons le texte dans le titre de la fenêtre du terminal:



PS1='$(info)'; case "$TERM" in xterm*|rxvt*) PS1="\[\e]0;$(face 1) \w\a\]$PS1";; esac


L'en-tête affichera le visage et le répertoire courant, mais vous devrez modifier légèrement la fonction de visage pour qu'elle dessine le visage sans codes de couleur, ils seront affichés dans l'en-tête sous forme de texte, nous passerons un paramètre à la fonction de visage (par exemple, "1"), ajouter une coche à l'intérieur de la fonction, si le 1er argument est donné, sortez le museau sans décoration:



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"
}






Script final:



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


C'est tout, merci de votre attention!) Abonnez-vous, genre, c'est tout, le projet est dans le github de la barre d'information Créer, inventer, essayer!)



contrôle de soins
"#" "$"?)



(*) (*)



All Articles