LINUX.ORG.RU

Сохранение цвета при перенаправлении вывода

 


0

2

Я хочу сохранить цвет при перенаправлении вывода команд вроде grep и ls.

Гугл вывел следующее предложение:

$ script -c "ls" output
$ less -r output

Однако! если использовать script в интерактивном режиме, то все цвета и контрольные последовательности сохраняются (как и было задумано), но если использовать в не-интерактивном режиме (как в примере выше), то разметка цветов теряется.

Как всё-таки сохранить расцветку вывода, не прибегая при этом к использованию интерактивности?

[EDIT]: Технически проблема решена (решение описано в комментарии ниже). Однако приведённое решение нельзя назвать самым приятным — в вывод добавляются лишние строки.



Последнее исправление: ilgors (всего исправлений: 1)
Ответ на: комментарий от anonymous

слишком специфично

как тогда сохранить цвета/контрольные символы в выводе `pip` или `screenfetch`/`neofetch`?

ilgors
() автор топика
Ответ на: комментарий от ilgors

Программы обычно детектируют, выводят ли они в терминал или в файл. Можно перехватить функцию isatty(), или что они там для этого используют.

anonymous
()
Ответ на: комментарий от anonymous

Судя по всему, ls и grep используют не isatty(), а проверяют некие переменные окружения вроде $TERM или $-

ilgors
() автор топика
Ответ на: комментарий от ilgors

ls.c:

            print_with_color = (i == color_always
                                || (i == color_if_tty
                                    && isatty (STDOUT_FILENO)));

man script:

       -c, --command command
              Run the command rather than an interactive shell.       
              This makes it easy for a script to capture the output of a program that behaves
              differently when its stdout is not a tty.

Так что всё верно.

xaizek ★★★★★
()

решение

следующий код работает вполне сносно:

echo "ls" | script --quiet output

Однако добавляет дополнительные строки в начале и в конце (имитируя ls и exit).

ilgors
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.