Jak zatrzymać kolor PS1 powłoki bash, aby zatrzymać się na końcu polecenia?

12

Mam niestandardowy kolor PS1, w którym mam rzeczywiste polecenia powłoki w innym kolorze, aby szybko zobaczyć, jakie polecenia wpisałem, i oddzielić je od samego wyjścia polecenia.

Załóżmy, że kolor w PS1 jest ustawiony na „niebieski” w wierszu polecenia, a domyślny kolor w mojej powłoce to biały.

  • Wpisuję polecenie np. Ls, (ls -l ma kolor niebieski)
  • Wyjście, które generuje, pierwszy wiersz jest nadal niebieski
  • Cała pozostała linia ma kolor biały

Chcę, aby wszystkie dane wyjściowe po poleceniu były „białe”.

Inny przykład:

  • Wpisuję polecenie „kot”, kolor jest niebieski
  • Wyjście pochodzi, całe wyjście jest niebieskie

Chciałbym, aby wynik był „biały”, a wiersz polecenia wpisałem „niebieski”

W przypadku niektórych poleceń jest w porządku, inne polecenia, ten sam kolor przelewa się do pierwszego wiersza wyniku, a następnie włącza się domyślny kolor i niektóre inne polecenia, całe wyjście (np. Cat) ma ten sam kolor.

Czy istnieje sposób, aby zachować tylko domyślne polecenia, które wpisałem w jednym kolorze, a resztę?

Jestem na OSX.

EDYCJA 1

Oto zrzut ekranu, do którego link @ derobert jest dołączony w komentarzach, który pokazuje, czego szukam.

                 ss # 1

iloraz inteligencji.
źródło
2
Musisz pokazać nam swój monit, abyśmy mogli zlokalizować błędy.
glenn jackman

Odpowiedzi:

14

Zasadniczo chcesz zresetować kolor terminala tuż przed wykonaniem polecenia przez bash. Można to zrobić za pomocą trap.

Na przykład:

trap '[[ -t 1 ]] && tput sgr0' DEBUG

Bash wykonuje DEBUGpułapkę bezpośrednio przed poleceniem, więc spowoduje to tput sgr0(które resetuje atrybuty formatowania) uruchomienie przed każdym poleceniem.

Jest [[ -t 1 ]]to kontrola bezpieczeństwa, aby upewnić się, że STDOUT jest rzeczywiście terminalem. Mogą występować przypadki, w których STDOUT basha nie jest podłączony do terminala (potokowanie, zdalne ssh itp.), Więc nie chcesz tputwysyłać kodów ucieczki terminala.

Patrick
źródło
Gdzie to położyłeś? Powiedzmy, że PS1 nie przywraca koloru. Jak teraz dodać tę linię, aby wykonać to polecenie zaraz po tym, jak użytkownik wprowadzi swoje polecenie i naciśnie klawisz Enter?
polim
1
@polym w twoim .bashrc(lub gdziekolwiek $PS1jest ustawiony). Umieściłbym to tuż obok $PS1definicji, żebyś wiedział, że są ze sobą powiązane.
Patrick
ok, wow, to działa. Czy jest jakaś możliwość, że to pójdzie nie tak?
polim
@polym już nie
Patrick
genialne, właśnie tego potrzebowałem, aby zresetować kolor terminala.
iQ.