Comment by inetknght

6 years ago

> “good citizen” features like turning off colors when stdout is not a tty.

Better solution: do not detect whether your output is a tty or not.

Let the user decide they want colors or not by using `--color=always` or `--color=never` or similar.

There's few things worse than writing a script and getting different output just because you're no longer running the program interactively.

I don't see how this is supposed to work? Let's take "grep" for example -- you want both of these to work, and print color to terminal:

    grep box file.txt
    grep box file.txt | grep -v orange-box

Having --color=always is nice sometimes, but there is a reason grep has "--color=auto" and it is the default. If we write invisible characters to file, this breaks all sorts of tools, so it is much safer and more predictable to not include them.

  • If I wanted to see just orange-box, then I would do

        grep --color=always orange-box file.txt
    

    But, I don't want to see just orange-box. I want to see orange-box and compare against other cases of box. So I would do:

        grep --color=always box file.txt | grep --color=always orange-box
    

    Without that --color=always, other cases of box will be drowned out by the noise.

    And if I wanted to write that out to a file then I would do

        grep --color=never orange-box file.txt > matches.txt
    

    Alternatively, I'd add a filter to the file with `ansi2txt`

        grep --color=always box file.txt | grep --color=always box | ansi2txt > no-color-matches.txt

    • I think the point the person you are replying to was trying to make is that in your proposed sequence of colored greps, the second one would not catch the "orange-box"es because of the extra chars added for coloring the output of the first grep.

      Maybe grep should ignore ansi sequences optionally or by default, to solve this?

Gah i got bit by this with 'jq'!

> $ echo "{}" | jq > {} > $ echo "{}" | jq > out.json > jq - commandline JSON processor [version 1.5-1-a5b5cbe] ... etc ...

Turns out when stdout isn't a tty you _must_ specify a filter (in this case '.')