Is there anyway to pass terminal colors through a pipe?
As a simple example, ls -l --color=always | grep ii
.
When you just run the ls -l --color=always
part alone, you get the filenames color coded. But adding grep ii
removes the color coding and just has the grep
match highlighting.
Screenshot of both examples:
In the above example I would want ii.mp3
and ii.png
filenames to retain the cyan and magenta highlighting, respectively. With or without the grep
match highlighting.
Question is not specific to ls
or grep
.
If this is possible, is there a correct term/name for it? I am unable to locate anything.
For the most part, this happens because those programs check if stdout is a pseudo-terminal (pty) and automatically disable color output because if you’re doing say
ls -l
and try to parse it, you’ll have all the ANSI escape sequences mixed in, so for safety and predictability they disable color.It is unfortunately a per-program thing. It is possible to fake it using
script
orunbuffer
according to https://stackoverflow.com/a/32981392Looks like
socat
can also be used for that: https://unix.stackexchange.com/a/157463