diff
не может выводить цвета, вам нужна другая программа, например, colordiff
для этого. Цвета в терминале печатаются через управляющие коды ANSI, которые по умолчанию меньше интерпретируют. Чтобы less
правильно отображать цвета, вам нужен -r
, или даже лучше, -R
переключатель:
colordiff -- "$file1" "$file2" | less -R
От man less
:
-R or --RAW-CONTROL-CHARS
Like -r, but only ANSI "color" escape sequences are
output in "raw" form. Unlike -r, the screen appearance
is maintained correctly in most cases. ANSI "color"
escape sequences are sequences of the form:
ESC [ ... m
where the "..." is zero or more color specification
characters For the purpose of keeping track of screen
appearance, ANSI color escape sequences are assumed to
not move the cursor. You can make less think that
characters other than "m" can end ANSI color escape
sequences by setting the environment variable LESSAN‐
SIENDCHARS to the list of characters which can end a
color escape sequence. And you can make less think
that characters other than the standard ones may appear
between the ESC and the m by setting the environment
variable LESSANSIMIDCHARS to the list of characters
which can appear.
Кроме того, вы можете использовать, more
который будет отображать цвета по умолчанию правильно.
Если вы не можете установить внешние программы, вы сможете получить тот же вывод, используя более ручной подход:
diff a b |
perl -lpe 'if(/^</){$_ = "\e[1;31m$_\e[0m"}
elsif(/^>/){$_ = "\e[1;34m$_\e[0m"}'
less -RM +Gg
: superuser.com/questions/64972/…Другие ответы здесь могут быть устаревшими. Начиная с coreutils 3.5
diff
действительно может выводить цветной вывод, который по умолчанию отключен, когда стандартный вывод не является консолью.Со страницы руководства:
Для принудительного вывода цвета, когда стандартный вывод - это труба
diff --color=always -- "$file1" "$file2" | less -R
должна работать.источник
alias diff='diff --color=always'
в.bashrc
или.zshrc
файл.alias diff='diff --side-by-side --left-column --color=always'
alias diff='/usr/bin/diff --color=always '
и,alias less='/usr/bin/less -r '
хотя хотя различие первоначально окрашено на первых нескольких страницах меньшего количества, но на длинных различий это иногда возвращается к моно. Это может быть при переходах, которые явно не будут влиять на diff, так как его выходные данные генерируются только один раз и не должны переходить, но как-то меньше теряют след цветов.Чтобы труба разноцветная, чтобы меньше:
Чтобы сделать его более читабельным, ограничив его одним экраном:
И, чтобы меньше отображалось, если есть только один контент на экране:
-F вызывает немедленное закрытие при меньшем количестве страниц, если экран содержит менее одного экрана. Канал к stderr объясняется тем, что при меньшем закрытии вы теряете выходные данные - при передаче по трубопроводу на stderr он получает выходные данные, даже если меньше не отображает.
Альтернативный (и, мне кажется, лучший) способ - просто использовать -X, чтобы не допустить менее четкой очистки экрана:
Это хорошо работает для меня, но может быть специфичным для bash. Colordiff не является встроенным, но легко устанавливается.
источник
less -r