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
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?
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
[[ $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
"#" "$"?)
(*) (*)