Zmień kolor konkretnej litery w nazwie użytkownika w PS1 bash

9

Chcę zmienić kolor konkretnej litery w mojej nazwie użytkownika wyświetlanej przez PS1 w bash.

Np .: Jeśli \utak rahul, chciałbym, aby list hbył w kolorze niebieskim, a reszta - biała.

Ja wiem, że \uodnosi się nazwa użytkownika i dodanie koloru do całego „podmiot” odbywa się poprzez dodawanie znaczników, takich jak: [\033[38;5;15m\].

Jeśli to możliwe, czy mogę wiedzieć, jak to zrobić.

Rahul Bharadwaj
źródło

Odpowiedzi:

13

Jeśli nie masz nic przeciwko nieużywaniu \uucieczki, możesz to zrobić w następujący sposób:

PS1="\[\e[0;31m\]${USER:0:1}\[\e[m\]${USER:1} "

Spowoduje to ustawienie monitu o podanie tylko nazwy użytkownika i spacji. Pierwszy znak nazwy użytkownika będzie czerwony. Działa to poprzez $USERdwukrotne rozszerzenie zmiennej o określony zakres. Za pierwszym razem zakres wynosi od 0 do 1. Za drugim razem od 1 (drugi znak) do końca.

Aby otrzymać monit tak, jak prosiłeś, użyj tego:

PS1="${USER:0:2}\[\e[0;34m\]${USER:2:1}\[\e[m\]${USER:3} "
Sebastian Stark
źródło
1
Możesz po prostu pominąć długość, aby wydrukować cały ciąg zaczynający się od offsetu : ${USER:1}dla całej nazwy użytkownika z wyjątkiem pierwszego znaku. Fajne rozwiązanie! Czy możesz także pokazać, jak zmienić kolor trzeciej postaci, zgodnie z żądaniem OP?
deser
1
Można przetestować takie rzeczy echo -e, np.echo -e "${USER:0:2}\e[0;34m${USER:2:1}\e[m${USER:3} "
deser
2
Czy to musi działać z różnymi różnymi nazwami użytkowników (np. Wyróżnić trzecią literę dla wszystkich)? Jeśli jest to tylko dla ciebie, prostszym podejściem jest po prostu zakodowanie liter nazwy użytkownika, np. raZamiast ${USER:0:2}, itp.
egmont
Twarde kodowanie @egmont prawie nigdy nie jest najlepszym sposobem, ale często znacznie prostsze. W ten sposób możesz upuścić kod w globalnym pliku konfiguracyjnym lub udostępnić go innym. I obsługuje przypadek zmiany nazwy konta.
Sebastian Stark
1
Osobiście dzielę się własną konfiguracją powłoki między trzema kontami o różnych nazwach. Ale może nie powinniśmy tu wchodzić w filozofię :)
Sebastian Stark