rote Augen





Hallo, ich präsentiere Ihnen ein kleines Tutorial zum Entwerfen einer Eingabeaufforderung mit roten Augen.



Jeder, der in der Konsole eines Linux gearbeitet hat, hat wahrscheinlich die praktische Funktion bemerkt, den aktuellen Ordner, den Benutzernamen, den Servernamen und etwas anderes anzuzeigen, abhängig von der Distra in der Eingabeaufforderungszeile. Mir hat es auch immer gefallen. Aber manchmal stellte sich das so heraus:







Es ist schwierig, in einer Zeile mit drei Zeichen zu "erstellen", natürlich bewegt sich der Cursor zur nächsten Zeile, aber es macht mehr wütend als hilft. Und irgendwann sagte ich mir:







Ich beschloss, den gesamten Befehlszeilenbereich zurückzunehmen und ihn nie wieder jemandem zu geben. Die Frage war, wie man den Eingabeaufforderungstext ändert. Es stellte sich als sehr einfach heraus, ändern Sie einfach die spezielle Systemvariable "PS1".







Ja, Sie können einen neuen Einladungstext direkt im Terminal festlegen. Aber wie speichern Sie die Änderungen? Und auch ohne Informationen zum aktuellen Katalog fühlen Sie sich irgendwie unwohl und stellen sich ständig die Frage: "Wo bin ich?" Die ~ / .bashrc- Datei wird helfen , darin können Sie die PS1-Änderung speichern, und damit Informationen über das aktuelle Verzeichnis nicht den Arbeitsbereich belegen, habe ich beschlossen, sie nicht IN, sondern ÜBER der Befehlszeile zu platzieren. Fügen Sie der Datei ~ / .bashrc die folgende Zeile hinzu :



PS1='$PWD\n# '


Achten Sie auf einfache Anführungszeichen. Wenn wir doppelte Anführungszeichen verwenden, wird anstelle eines Zeigers auf die Variable $ PWD (eine Systemvariable, die den vollständigen Pfad des aktuellen Ordners analog zum Befehl pwd speichert) der Wert (aktuelles Verzeichnis) in die Eingabeaufforderungszeichenfolge geschrieben und beim Verschieben aus dem Ordner geändert wird nicht im Ordner sein. Es sieht folgendermaßen aus: Die







Befehlszeile ist völlig kostenlos, aber der Ordnername wird mit dem Inhalt zusammengeführt, wenn Sie den Befehl ls ausführen . Wir müssen die Fliegen von den Schnitzel trennen , den Ordnernamen vom Inhalt. Ich habe beschlossen, "Frames" für $ PWD hinzuzufügen, indem ich oben und unten "-" Zeilen hinzufügte. Wie finde ich die Anzahl der Zeichen in einer Zeichenfolge heraus? Dazu gibt es auch die Systemvariable $ COLUMNS.... Verwenden Sie den Befehl printf, um schnell eine Zeichenfolge mit der erforderlichen Anzahl von "-" Zeichen zu bilden :



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


Dieser Befehl erstellt eine Variable $ line und füllt sie mit Leerzeichen in Höhe von $ COLUMNS. Wir benötigen jedoch keine Leerzeichen, sondern "-". Dazu verwenden wir den folgenden Trick:



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


Fügen wir diesen Code zu ~ / .bashrc hinzu



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






Großartig, aber wenn wir jetzt die Größe des Terminalfensters ändern, ändert sich die Größe der "Linien" nicht und die Schönheit verschwindet:







Um die Situation zu korrigieren, übertragen wir den neuen Code in die Infofunktion und fügen ihn PS1 hinzu:



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


Sie können Geschäft mit Vergnügen verbinden, indem Sie dem oberen Trennzeichen mit dem Hostnamen ein "Auffüllen" hinzufügen. Die Einfügung mit dem Namen befindet sich in der Mitte. Dazu müssen wir die Mitte der Zeile berechnen (unter Berücksichtigung der Länge des Hostnamens und zusätzlicher Zeichen):



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






Ich habe den Hostnamen in geschweifte Klammern mit Leerzeichen eingeschlossen, aber anstelle von Leerzeichen um $ HOSTNAME werden die Zeichen "_S_" verwendet, die dann in Leerzeichen geändert werden. Dies ist erforderlich, da alle Leerzeichen in der letzten Zeile durch "-" ersetzt werden und Leerzeichen in der Einfügung verbleiben müssen. Fügen wir Farben hinzu. Dazu bereiten wir Variablen mit Codes zum Ändern der Farbe des Texts im Terminal vor. Ich habe die folgenden Farben verwendet:



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


Fügen wir diese Variablen unserem Code hinzu:



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






Gehen Sie voran, die rechte Seite sieht leer aus, Sie können dort Datum und Uhrzeit eingeben:



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


Um dies rechts zu platzieren, müssen Sie nach $ PWD einige Leerzeichen hinzufügen. Was, lassen Sie uns zählen:



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






Kannst du es besser machen? Fügen wir natürlich die Ausgabe des Git-Status hinzu, wenn wir uns in dem Ordner mit dem Git- Projekt befinden:



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






Beachten Sie, dass git_clr und git_tst zuerst als Array geschrieben und dann in Variablen konvertiert werden. Dies ist erforderlich, um Zeilenumbrüche aus der Ausgabe des Git-Status zu entfernen . Aber wo sind die Augen? Jetzt gibt es O_o-Augen. Erstellen wir ein Array mit einer Reihe grundlegender Augen:



eyes=(O o ∘ ◦ ⍤ ⍥)


Und lassen Sie uns ihre Anzahl zählen:



en=${#eyes[@]}


Fügen wir ein Mundsymbol hinzu:



mouth='_'


Und lassen Sie uns einen Generator aus zufälligen Gesichtern erstellen:



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


Die Augen befinden sich an den Rändern des Informationsfeldes. Sie müssen sie bei der Berechnung der Anzahl der Leerzeichen in der Mitte berücksichtigen. Wir bereiten hierfür eine separate Variable vor:



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






Wie können Sie Ihre Augen erröten lassen? Ich saß lange am Computer und schlief nicht. Auf stackoverflow.com stieß ich auf eine interessante Frage . Der Autor fragt: "Wie kann man die Farbe in der Eingabeaufforderung in Rot ändern, wenn der letzte Befehl fehlschlägt?" Dies führte mich zu der Idee von roten Augen. Fügen wir der Info- Funktion hinzu, die sich an den Abschlussstatus des letzten Befehls erinnert:



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


Und ändern wir die Gesichtsfunktion so, dass sie die $ error- Variable überprüft und je nach Wert die Augen rot oder gelb malt:



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






Nun , meine Augen wurden rot, aber Sie können noch etwas hinzufügen. Fügen wir eine Prüfung für die Variable $ debian_chroot hinzu :



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


Und ändern wir den Text im Titel des Terminalfensters:



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


Die Überschrift zeigt das Gesicht und das aktuelle Verzeichnis an, aber wir müssen die Gesichtsfunktion leicht ändern , damit das Gesicht ohne Farbcodes gezeichnet wird. Sie werden in der Überschrift nur als Text angezeigt. Wir übergeben der Gesichtsfunktion einen Parameter (zum Beispiel "1"). Fügen Sie ein Häkchen in die Funktion ein. Wenn das erste Argument angegeben ist, geben Sie die Schnauze ohne Färbung aus:



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






Endgültiges Drehbuch:



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


Das ist alles, danke für deine Aufmerksamkeit!) Abonniere, das ist alles, das Projekt befindet sich in der Info-Leiste. Github Erstellen, erfinden, versuchen!)



Pflegecheck
"#" "$"?)



(*) (*)



All Articles