Куда переходят мои управляющие коды ANSI, когда я передаю канал другому процессу? Могу ли я оставить их?

36

Иногда я хочу передать вывод с цветовой кодировкой процесса, например. grep ... но когда я передаю его другому процессу, например. Сед, цветовые коды потеряны ...

Есть ли какой-то способ сохранить эти коды без изменений?

Вот пример, который теряет цветной вывод:

echo barney | grep barney | sed -n 1,$\ p   
Peter.O
источник
4
PS .. как общая информация .. Я только что обнаружил, что lessможет принимать цветной ввод текста (хорошо :) ... например: tree -C ~/ |less -Rилиls -lR --color=always . |less -R
Peter.O

Ответы:

40

Многие программы, которые генерируют цветной вывод, обнаруживают, пишут ли они в TTY, и отключают цвета, если это не так. Это связано с тем, что цветовые коды раздражают, когда вы хотите захватить только текст, поэтому они пытаются автоматически «делать правильные вещи».

Самый простой способ получить вывод цвета из такой программы - сказать ей писать цвета, даже если она не подключена к TTY. Вам нужно будет прочитать документацию программы, чтобы узнать, есть ли у нее эта опция. (например, grepимеет --color=alwaysвозможность.)

Вы также можете использовать expectскрипт unbufferдля создания псевдо-tty, как это:

echo barney | unbuffer grep barney | sed -n 1,$\ p
CJM
источник
2
спасибо за эту информацию об обнаружении TTY и фальсификации unbuffer!
Оболочка
@cjm .. Здесь не работает (в Ubuntu 10.04 / bash 4.1.5) ... но в моем репо 10.04 есть только версия -dev и ничего в бэкпорте ... Здесь немного поздно, поэтому я посмотрю снова завтра ... но, как вы сказали, эти программы окраски, вероятно, переключаются в соответствии с назначением вывода (м-м-м, но как они узнают, что это очень важно ... не имеет значения) .. и у них вполне может быть возможность принудительно вызвать это .. спасибо ,,,
Peter.O
@fred, они обычно используют isatty, чтобы узнать, куда они stdoutидут. Я на самом деле не уверен, unbufferработает ли, когда вы работаете как с программой, так и с ней; У меня не установлено здесь, чтобы попробовать.
CJM
спасибо за unbufferинформацию, это помогает выводу моего бота IRC как вывод в оболочке.
LiuYan 研 研
4

Меня устраивает ;-! (в текущей среде MingW)

echo barney | grep --color=always barney | sed -n '1,$p'
**barney**

# Барни отображается как красный текст

$ grep --version
GNU grep 2.5.4

$ sed --version
GNU sed version 4.2.1
shellter
источник
@shellter ... да, этот конкретный пример grep работает и для меня ... Я не знал об этом, пока вы не опубликовали ответ, так что спасибо за это ... Однако. Я все еще задаюсь вопросом, есть ли какой-то общий способ сделать это ... например tree is colorized a-la dircolors if the LS_COLORS environment variable is set and output is to tty ... Может быть (?) Есть способ обмануть канал, заставляя его думать, что он выводит на TTY ... или какой-то такой общий обходной путь. .
Peter.O
Я только что проверил man tree... У него тоже есть похожая опция, -C... возможно, это обычная функция для программ, которые выводят цветовые escape-коды ..
Peter.O