Dostosowywanie powłoki bash: pogrubienie / kolor polecenia

13

Istnieje wiele samouczków / postów online (np. Http://www.cyberciti.biz/faq/bash-shell-change-the-color-of-my-shell-prompt-under-linux-or-unix/ ) o tym, jak dostosować monit w trybie bash przez ustawienie PS1. Czy istnieje sposób na dostosowanie koloru / pogrubienia polecenia, które wpisuję?

Innymi słowy, jako przykład powiedzmy, że chciałem zielony monit, pogrubienie niebieskiego polecenia, a następnie wyjście w dowolnych kolorach, które byłyby domyślne. W poniższym przykładzie już wiem, jak joe>ustawić „ ” zielony, niebieski, pogrubiony, cokolwiek, ustawiając PS1. Ale czy istnieje sposób, aby git statusna przykład pokazać śmiałość?

joe> git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
...
Jarsars
źródło
Jeśli chcesz naprawdę dobrej powłoki, powinieneś użyć zsh, co chcesz osiągnąć, byłoby bardzo prostepreexec() { printf '\e[0m' }
bollovan
3
@bollovan - „Naprawdę dobre” jest nieco subiektywne, uważam, że jest naprawdę obrzydliwe ze względu na wzdęcie i niezgodność z POSIX. Ale cokolwiek płynie twoją łodzią.
Chris Down,
@ ChrisDown wzdęcia płyną łodzią - nigdy nie słyszałem, dość zabawne.
n611x007

Odpowiedzi:

13

Będziesz musiał zostawić kolor kończący się po PS1 (zacznij go później >w przykładzie), a następnie użyj DEBUGpułapki bash, aby wyczyścić kolor przed uruchomieniem polecenia (ale po naciśnięciu klawisza Enter w powłoce. Spróbuj czegoś takiego :

shopt -s extdebug
trap "tput sgr0" DEBUG
Chris Down
źródło
dla kogoś obcego, by mógł uciec od kodów: czy to zachowałoby pierwotną kolorystykę polecenia (np. byłoby ls --color=alwayskolorowe)?
n611x007
@naxa - Tak, ponieważ to wyraźnie ustawia kody kolorów (z wyjątkiem kolorów, które są kolorowe w domyślnym kolorze terminalu, które zostaną zastosowane dopiero po pierwszym kolorze).
Chris Down,
Ta sztuczka wydaje się zakłócać uzupełnianie tabulacji (drukuje dziwne rzeczy, takie jak ^[(B^[[m). Zdarza się to jednak tylko na niektórych systemach: przetestowałem to na dwóch systemach, z których oba działały na Ubuntu 12.04 LTS, i tylko jeden z nich miał zakłócenia.
musiphil
7

Dla kompletności, oto jak ustawić kolor zachęty i kolor wprowadzania wiersza poleceń w bash. Umieść te linie w swoim .bashrc.

PS1='\[\e[1;34m\]\w\$ \[\e[0;32m\]'
trap 'printf \\e[0m' DEBUG

Pułapka DEBUG, jak sugeruje Chris Down , służy do resetowania atrybutów tekstu. Służy do debugowania, ale przydatne jest również wykonanie kodu przed wykonaniem polecenia wpisanego przez użytkownika .

W ustawieniu monitu:

  • \[…\] jest używany wokół sekwencji ucieczki, aby powiedzieć bashowi, że nie zajmują żadnej nieruchomości ekranowej (bez nich ekran stałby się zniekształcony, gdy bash musiałby przerysować monit).
  • \e[…mgdzie jest liczbą, lub bardziej ogólnie sekwencją liczb oddzieloną średnikami, jest sekwencją ucieczki wysłaną do terminala, aby wpłynąć na kolor i inne atrybuty poniższego tekstu. Na przykład 1;34ustawia pogrubiony niebieski; 0;32resetuje wszystkie atrybuty, a następnie zmienia kolor na zielony. Dostosuj się do smaku.
  • \w\$wydrukuj bieżący katalog i $lub #. Możesz oczywiście zmienić to na co chcesz i wstawić zmiany atrybutów tekstowych pomiędzy nimi, jeśli chcesz.
  • Na końcu jest ostatnia zmiana atrybutu, która określa kolor wprowadzania tekstu.
Gilles „SO- przestań być zły”
źródło
Do Twojej wiadomości, kody / sekwencje kolorów bash można znaleźć tutaj: misc.flogisoft.com/bash/tip_colors_and_formatting
kaiwan
0

Właśnie uczę się o poleceniach BASH i siedzę tutaj, bawiąc się poleceniami kolorów w mojej wersji. Wymyśliłem to rozwiązanie:

Za pomocą tego polecenia:

PS1='\[\e[0:36m\]\h>\[\e[0;31m\]'

Dekonstrukcja: PS1 =: uruchamia polecenie PS1

'': zawiera polecenie w pojedynczym cudzysłowie (więc BASH nie uważa, że ​​to polecenie)

\: każde indywidualne polecenie zaczyna się od tego

[]: zawiera każde polecenie

\ e (może być również \ 033 znakiem ucieczki ASCII): uruchamia polecenie koloru

Polecenie koloru poprzedza rzecz, której dotyczy.

[\ e [0; 36m]: cyan

\ h: nazwa hosta

„>”: drukowane po nazwie hosta

[\ e [0; 31m]: czerwony

Najwyraźniej czerwone polecenie na końcu powoduje, że dane wejściowe stają się czerwone. Po prostu zmień kolory według własnych upodobań i właśnie tego szukasz.

Ta strona pomogła mi trochę:

https://www.linuxnix.com/linuxunix-shell-ps1-prompt-explained-in-detail/

Moja wersja: GNU bash, wer. 4.2.46

Dbać,

Łasica

Łasica
źródło