Как мне остановить цвет оболочки bash PS1, чтобы остановить в конце команды?

12

У меня есть собственный цвет PS1, где у меня есть фактические команды оболочки в отдельном цвете, просто чтобы я мог быстро увидеть, какие команды я набрал, и отделить его от самого вывода команды.

Предположим, что цвет для PS1 установлен на «синий» для командной строки и цвет по умолчанию в моей оболочке - белый.

  • Я набираю команду, например, ls, (ls -l окрашен в синий цвет)
  • Вывод, который он генерирует, первая строка все еще синяя
  • Вся оставшаяся строка становится белой

То, что я хочу, это чтобы весь вывод после команды был «белым».

Другой пример:

  • Я набираю команду "кошка", цвет синий
  • Выход приходит, весь вывод синий

Я хотел бы, чтобы вывод был «белым» при сохранении командной строки, которую я набрал «синим»

В некоторых командах это нормально, в других командах тот же цвет перетекает в первую строку вывода, а затем включается цвет по умолчанию и некоторые другие команды, весь вывод (например, cat) имеет тот же цвет.

Есть ли способ сохранить только те команды, которые я набрал, одним цветом, а остальные по умолчанию?

Я на OSX.

РЕДАКТИРОВАТЬ # 1

Вот скриншот, на который @ derobert ссылается в комментариях, который показывает, что я ищу.

                 сс # 1

Iq.
источник
2
Вы должны показать нам свое приглашение, чтобы мы могли точно определить ошибки.
Гленн Джекман

Ответы:

14

По сути, вы хотите сбросить цвет терминала прямо перед тем, как bash выполнит команду. Это можно сделать с помощью trap.

Например:

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

Bash выполняет DEBUGловушку непосредственно перед командой, поэтому это приведет к tput sgr0(что сбрасывает атрибуты форматирования), выполняемому перед каждой командой.

Это [[ -t 1 ]]проверка безопасности, чтобы убедиться, что STDOUT на самом деле является терминалом. В некоторых случаях STDOUT bash не подключен к терминалу (трубопровод, удаленный ssh ​​и т. Д.), И поэтому вы не хотите tputотправлять управляющие коды терминала.

Патрик
источник
Куда ты это положил? Допустим, PS1 не меняет цвет. Теперь, как добавить эту строку для выполнения этой команды сразу после того, как пользователь ввел свою команду и нажал клавишу ввода?
полим
1
@polym в вашем .bashrc(или там, где $PS1установлено). Я бы поставил это рядом с $PS1определением, чтобы вы знали, что они связаны.
Патрик
хорошо, вау, это работает. Есть ли вероятность, что это может пойти не так?
полим
@polym больше нет
Патрик
блестящий, это именно то, что мне нужно для сброса цвета терминала.
IQ.