No_color
no-color.org
no-color.org
> The terminal is capable of color and should be able to print color when instructed. NO_COLOR is a hint to the software running in the terminal to suppress addition of color, not to the terminal to prevent any color from being shown.
I have to admit I don't really get this. I personally like colorized output, and I can't even think of situations where the colors chosen by a developer were so bad I wanted to disable them completely.
I respect others like no color (and there's already a solution per that, above), but I don't quite get the desire to have just some color (prompts but not applications). Can someone with this opinion explain their rationale?
Normally I wouldn't care, -- individual preferences are like opinions and everyone is entitled to their own -- but this imposes work on every developer/application. There's certainly ways to implement this that minimize impact, but it's still a non-zero up-front and ongoing maintenance/testing cost.
There's a few programs i use where the colours were clearly chosen to work on a dark theme terminal. I use a light theme terminal, and they're illegible.
I suppose the real problem here is that the output is tagged with physical colour, rather than some kind of semantic label which could be mapped to a colour in terminal configuration. But it's probably too late to do anything about that.
As an example, take solarized, or really any of the base16 themes. When I've used solarized in the past, many terminal programs that expect to print something in red are actually printing in a slightly-dimmed-background color, or purple, or something else where the intention of the tool author and the intention of the theme author conflict.
Coincidentally I’ve gone into rants a number of times in the past on here about developers not using the correct colour palettes and the answer I always receive back for why it’s ok is because “developers should be able to chose how their application looks like”, which is fine if they control the entire design stack like they would on a website. But it makes zero sense in the terminal.
[checks the color library I'm currently using to build a CLI]
I've had that problem with the default LS_COLORS/DIR_COLORS settings in some Linux installs. It's very annoying.
Given the existence of shell pipelines, i might even want different palettes within a single stream of output, so this mapping couldn't even be done by hooking command execution to apply a different mapping in the terminal.
Obviously won't help if you're using a teletype or punched cards or something like that.
I've used ANSI codes to invert colors (which works pretty well for highlighting), and dim colors, but those can't solve everything.
[1]: https://github.com/PaulJuliusMartinez/jless/issues/4 [2]: https://github.com/morhetz/gruvbox
The bright theme should invert the "dark" and "light" colors.
But sometimes software that I use irregularly, or only in specific circumstances, does it poorly, and it's a real pita. I've had occasions where I missed entire pieces of output because they rendered as the background color for some reason. So for those cases it'd be nice to have a universal switch, so to speak, to just turn it off.
I also get that for some people it's just an aesthetic choice... I don't think color is _that_ helpful that someone would be impaired by not having it.
All that said, this proposal reminds me of that one xkcd with the 13 competing standards.
This env var wasn't a universal enough solution the last time I tried it, so I just set almost all my term colors except red (for the quote matching) to black.
On the whole I'm really put off by the aesthetics of programming. The default still seems to be very "gamer": dark mode, neon everything—I can practically smell the Mtn Dew through my screen sometimes.
>The default still seems to be very "gamer": dark mode, neon everything
Dark mode is common but I've seen dull tones predominate for normal text over the last decade at least.
Oh, come on... Look at the original terminals from the old days. Dark background with green or amber text. Dark terminals are the normal thing, nothing to do with gamers. My guess is it was less power to only light up the text parts instead of the inverse. Light themes, on a computer, seem unnatural in the way they force as much light as possible on. They're trying to emulate paper, which is white by default, but I don't think that should be considered normal on a computer.
2. Those early terminals were monochromatic though. They were stark and utilitarian, not the Vegas-ass colors some of my coworkers are rocking.
3. Paper is what I aim for. I have read black text all my life, including the textbooks that taught me to program, so it makes a lot of sense to work like this as well. I don't go full white though; Plan 9's Acme theme is the acme of palettes to me.
IMO in the case of package managers it actually makes it more readable. For example zypper (in openSUSE) uses a colored heading to group the packages it is going to install/upgrade/remove/etc and it uses a color for the first letter of each package, both making it very simple to quickly scan the packages that are going to be installed or affected whenever there is a big list of them - e.g. i can quickly skip all the libraries (since they begin with "l").
https://github.com/kurtbuilds/no-ansi
Written in rust and ultimately uses vte from alacritty to write through a virtual terminal. Can be given a file on the command line.
https://github.com/emptymonkey/dumb
Written in Lex and just strips a number of specific escape sequences (written 9 years ago so likely doesn't include a few). Only stdin to stdout.
Edit: And now I see the discussion below about nofun and the equivalent sed command that use regex. ... and reading more I see ansi2txt in colorized-logs (the one most likely to be packaged) that also effectively is a regex, although written out in C.
The output is sometimes 'too busy' and the colours are of arbitrary values which may mean any number of things, and if you don't what they mean they're just noise.
Further the same thing may be signified by different colours by different programs (editor A may have, e.g., variables as colour X, but editor B may have variables as colour Y, and the pager as colour Z).
Perhaps if I was a coder, using one environment/editor/IDE, I could learn things. But as a sysadmin (whose been doing this for a few decades: Linux, BSD, Solaris, IRIX), I have never found colour† useful since I'm doing things in all sorts of contexts in the course of a day, and have never really found a need.
† Besides the prompt perhaps.
It's sort of how I always set VMs to have a dark grey flat background. Makes it easier to see at a glance whether you're in a fullscreen VM or the host system.
Obviously sometimes you might want to grep your logs and then color sequences might be annoying. I guess there is a command line tool / sed / awk oneliner to remove them. Unix filters are from the 1970s after all.
The question is just what is the tool. I'd guess SO knows... But it's Sunday morning and I am on my phone not motivated to work :)
Note btw that one might have a wildly different perspective as e.G. Developer using a few tools on their own controlled desktop a lot, vs e.G. a sysadmin constantly jumping between large number of tools on large number of systems. As such, having a simple variable to shut up all the apps on all the servers may be quite handy.
The main use case for this is that there are tools that use ANSI color libraries and don't handle non-colorization in non-TTY contexts. So what ends up happening is a user of said tool pipes its output to a log file and since ANSI escape codes are in-band, the log file becomes an unreadable mess. NO_COLOR provides a way for the library to give control over colorization to the user, even if the tool consuming the library hard codes colorization logic.
I think it's fine if the logs are going straight to stdout/stderr in a console. Any other destination (piped output, logfile) should default to no color.
Don't even get me started on TrueColor :)
This is also in opposition to the motivation explicitly laid out in the website itself.
>An increasing number of command-line software programs output text with ANSI color escape codes by default. While some developers and users obviously prefer seeing these colors, some users don’t. Unfortunately, every new piece of software seems to have a different way of disabling colored text output and some software has no way at all.
Clearly, the motivation laid out here is in fact to provide a standard mechanism to disable the colors seen by the user on the terminal. Not to disable coloring when output is being redirected.
"Why not just" = lack of experience in the domain
From my experience, the usual reasons are: unwillingness from tool author to accept PRs, tool is unmaintained/abandoned, tool forces color across a non-TTY in child processes calling other tools inside of itself, "ain't nobody got time to patch hundreds of random tools that are downstream of some popular colorization library", etc.
Your reading of the motivation is naive. Piping is something users do. Whether a single user never wants colors or only sometimes is kinda irrelevant to the point that the feature is desired by users at all.
As I mentioned in my other comment, colorization wonkiness doesn't end with NO_COLOR; there's also FORCE_COLOR, --color/--colors/--no-color/--no-colors, TERM, CI, glue tools calling other tools with one or more of those flags, users who sometimes want colors but sometimes not, regardless of TTY-ness, configurable terminal colors, user-facing non-TTY pipes, fragmented TrueColor support, etc.
There's probably enough wonkiness in the domain of terminal colors in the wild to write one of those "falsehoods programmers believe about" articles.
What you might be missing is that “color” on the CLI is actually extra characters before and after a colored word. If the viewer does not interpret them (for example a web UI), they will just be extra characters. This is akin to printing `<strong>8000 bytes</strong>` and expect it to be rendered correctly everywhere it’s shown.
There also needs to be a NO_EMOJI flag. I'm tired of having random garbage glyphs show up because I'm not using the latest electron based terminal that uses mono-spaced web-fonts.
It doesn't take a Electron based terminal. iTerm2 on OS X supports emoji, and Terminal.app mostly does. Terminator on Linux supports them. (& which is based on VTE, so I sort of presume all VTE-based terminals do.) None of which are Electron based. (& I can understand not wanting that.)
(Not to imply that a NO_EMOJI might have other merits.)
I support the idea of a NO_EMOJI env var anyway. I think theming should be left up to the user in nearly all cases and we shouldn't have colors or emoji forced on us. Devs could have something like alt text to show when emoji aren't there for cases where they're showing a meaning that the text doesn't.
The more sparingly you use colour, the more effective it is as a means to highlight important information. Different users think different information is important.
I'm not sure how widespread it is but I work in the mining industry and I've seen a trend on newer installations towards keeping the general appearance of the entire interface to a couple of modestly contrasting neutral greys. Only parts of the plant which require operator attention are shown in colour (I think plant that's not in the normal automatic operation mode was yellow and alarms were red). The information's still all there and easy to read if the operator wants to, but it's not screaming for your attention unless it actually needs it.
Compare this with the usual visual confetti of brightly flashing colours that a SCADA system devolves into, especially after a few years when a lot of 'important new features' have been added 'which the operator needs to see'.
Colorized output really sucks when the output is displayed in a terminal that doesn’t support it. Visual Studio’s build output, online build terminals like CircleCI, log viewers, …
(Unsure if the ones I list above actually do have an issue with colors, but absolutely sure that I have seen it many times.)
Also, some of these tools don’t detect when they are run in a non interactive shell and will continue to write color codes when piped.
A NO_COLOR flag is not perfect but better than nothing and easier to implement than theme or interactivity detection
Is checking an environment variable that much easier than an isatty(3) call? I'm concerned that if this becomes widely implemented, developers will try using it as a poor substitute for isatty.
Also shell scripts can't directly use that.
A simple 3-state variable solves the problem easily.
While developers can make use of more than 8/16 colours today, I find that extremely rare, and if a colour display for an app does not work on your theme, it's either an app problem in that it wouldn't work well in any terminal, or a theme problem.
If it's an app issue, what makes you believe an author would rather implement NO_COLOR instead of fixing colour choices they made?
I think it would be more reasonable to define a standard set of environment variables based on semantics that can then be used explicitly by scripts and programs. Like CL_WARN=(code for red) CL_HILIGHT=(code for yellow) CL_OPTIONAL=(code for gray). This would make it very easy on script developers, who would only need to use these variables instead of their hard-coded ones.
Would it be nice if every pipeline tool supported the gambit of colors? Maybe, maybe I wouldn't care then. But as it is, more often than not, your cute colors just garbage up my build output.
2. Some color-using CLI tools assume white-ish background and actively use dark blue which is hard to see on a black background.
ls -la
Some terminals have picked their default ls colors so bad that some entries are almost unreadable. Dark blue on black etc. Forced me to configure the LS_COLORS.
PuTTY comes to mind immediately upon reading this sentence. It is used more often than I like.
https://www.chiark.greenend.org.uk/~sgtatham/putty/
The default colorscheme is extremely bad and if you use Vim to open log files, the comments are unreadable because they're colored as dark blue on a black background. Most of the other colors are unreadable as well. The widespread usage of PuTTY in my organization is the reason I have never written scripts or programs with colors, even though colors would help a lot of people differentiate between benign, warning, and error messages.
It might also be that COLOR is already used for other purposes by some software.
But I guess that ship has sailed.
https://github.com/Cloudef/bemenu#environment-variables
In such cases, environment variables lose their intended purpose and they need to be stuffed into wrapper scripts or overridden on the command line before executing a command, which is extremely annoying.
Why is this so annoying? It's a very common workflow that allows you to customize how an application behaves and simplify how you run it. It's no different than setting up an alias, and I'd rather use a wrapper script or alias than have to remember how the app is configured, or search my history for the correct invocation.
In fact, environment variables are a very flexible way of configuring an app. They're generic, work the same across apps (no worries about the various ways of specifying flags), avoid the need for a custom configuration file, you can have multiple .env files and load them with env(1), etc.
I'm a big fan of following the 12factor[1] approach.
I don't know about others but I'm not a fan of monstrosity like this
https://github.com/ayushnix/dotfiles/commit/2eb66eff8a03a5bf...
If I stuff it into a wrapper script, I'm essentially trying to emulate config files, which is what should've been used in the first place. This is why I prefer using config files rather than creating uglier and harder to maintain wrapper scripts.
> I'm a big fan of following the 12factor[1] approach.
I guess if you don't want state associated with your deployments, environment variables are better but I would still argue that they aren't manageable when their values become large as shown above or if their numbers start approaching double digits because when that happens, you're essentially emulating config files anyways.
I think in that case bemenu is abusing env vars to just stuff CLI arguments in a single one, so it defeats the benefit I mentioned above. It could be argued that having individual env vars for every option is cumbersome and pollutes the environment, but this is practically not a problem.
> If I stuff it into a wrapper script, I'm essentially trying to emulate config files, which is what should've been used in the first place.
Sure, but I see that as a positive. You don't have to worry about the many configuration file formats and their idiosincracies, where they're located and how they're passed to the application. Environment variables work across language stacks and platforms, are simple to implement and use.
> This is why I prefer using config files rather than creating uglier and harder to maintain wrapper scripts.
It's a matter of preference I guess, and I also don't use them for every app. In some cases they might be limiting, so a configuration file is the only option, but I appreciate whenever a program reads all configuration from the environment. It certainly simplifies a lot of things, e.g. running it in a container.
I'm sure you can even do some clever bash-foo to run your term sessions through it, like how screen or tmux work.
sed 's/\x1b\[[;0-9]*m//g'> One could do this with GNU sed, but developers working in proprietary operating systems don't have GNU sed.
Why prefer
NO_COLOR=true command
over command | nofun
?The latter seems both cleaner to me and it doesn’t require modification of all existing CLI programs to work.
"... should check for the presence of a NO_COLOR environment variable that, when present (regardless of its value), prevents the addition of ANSI color ..."
How common is this behavior ?
That is, the presence of the env var regardless of its value trips the conditional ?
That seems like asking for trouble / confusion ... especially since there is a very well understood practice of setting 0/1 false/true for settings like this.
Is this commonly done and I have just never noticed it ?
NO_COLOR=1
NO_COLOR=true
NO_COLOR=yes
Rather than parsing all the permutations, the usual evaluation of env vars that are expected to hold a boolean type is just the equivalent of: #ifdef NO_COLORAnd
NO_COLOR=
would lead to an non-intuitive behavior
Pretty normal, yeah. You can `unset FOO` a variable to set it to false.
I would assume that COLOR implies that only color escapes should be disabled, but the description also mentions “plain” output.
The problem is when people use explicit escape codes in their code rather than using libraries that solved this problem all the way back in the 80's.
Yes, I'm somewhat grumpy about this because far too many times I have found log files filled with escape codes, or colours that are absolutely unreadable when using a terminal with white background.
If you support NO_COLOR you're making things worse.
There is ansi2txt (packaged as colorized-logs on debian).
https://github.com/kilobyte/colorized-logs
I also found some answers on SO with people using a sed command for this.
https://stackoverflow.com/questions/17998978/removing-colors...
NO_COLOR and NO_EMOJI seem reasonable. Any other ideas?
As a rule, I don't see any reason why a terminal theme should have any color that is illegible on its background. That feels like a problem with the theme more than with the program running on it.
However, giving a standard enough momentum so that most developers will actually implement it is an incredibly hard thing to do. I honestly don't have much hope that this will reach enough projects to be practically usable. At least not without support/enforcement by distributions.
I also think that modifying shells instead could be a more pragmatic and effective solution - simply because there are less people you'd need to convince.
You could get the same outcome however by having the shell interpret the NO_COLOR variable and have it strip colors from each subprocess where it is set.
Also, I believe, most programs automatically disable colors when they detect that STDOUT does not point to a terminal. So couldn't you have the same effect by simply appending "| cat" to your command?
(what's up with all the non-IETF "standards" all over HN and GitHub? there is an open standards process for technology, people. is the problem that us old folks never taught the youngsters how to make them?)
This is bold. (Pun intended).
Colors are immensely beneficial for opt-in. I haven't heard very many complaints about it -- why does the author assume many users don't?
It's that 'many' is comparative to 'some' here.
Windows terminals mercifully had simply white-on-black for decades, but thanks to the various Azure and .NET Core teams, Microsoft has been invaded by Linux and Mac users. Now everything has to be CoLoUr all the time.
Random colours.
Colours that make no sense.
RED ERRORS that are actually just titles.
GREEN OKAY that's actually just a table header.
Etc...
I had the misfortune of being forced to use some Node and NPM tooling recently, having come from Visual Studio and C# programming.
It was strangely nostalgic, like... stepping back in time to the 1990s and almost childish user interfaces. The spinning |/-\ symbols (with colours!) just killed me. I hadn't seen those since DOS 6.
There's something perversely conservative about Linux. There's all this talk of how it's the best development environment, but to me all this "colors in the terminal" stuff just seems like a throwback to the days when I had a 486...
Developers are human too, surprisingly, and benefit from good UX!
I'm a bit surprised a seasoned programmer feel these design patterns and tools for humans is childish. Do Visual Studio/C# coders typically see the many different universes of tooling outside of the limited MS Stack as childish or less evolved?
Typical open source command line tools are written by random people from all over the place, and there is no consistency at all, except perhaps seeing orange for warning and red for error. All other bets are off.
It's not like PowerShell, where there's separate output streams for Debug, Verbose, Information, Console, Warning, Error, and Progress! Where those can be styled consistently by the terminal, instead of the l33t coder that sprinkled some random Christmas lights into the output of his "xvtj7" tool or whatever.
The reason "NO_COLOR" makes sense and is needed is because color in Linux-style tools is done at the wrong layer, in the wrong way.
Format and style the output as the last step, not first.
Don’t extrapolate too much from N=1. I used to work in a shop that mainly uses Microsoft technology. From those dozens of engineers, I don’t think I’ve ever heard that opinion. I would say the opposite, my impression was that most of them were quite happy with the increasing Unix-ification of Microsoft’s stack.
Ahem. Linux' actual HARDWARE terminals were green on black or orange on black.
But if it's to disable all colors in applications, then I believe changing TERM should work. And if you run something that you want colored you can override TERM for that process.
TERM=dumb is useful for cases where you absolutely want serialized output, such as CI logging. Interactive cases require you to choose a value that both your terminal emulator and the software supports.
At a more experiential level, chromatic vision is an elaboration. It is not required, but in the lives of our ancestors, its presence signified the availability of a rare and pleasurable (carbohydrate intensive) experience.
In design, this principle carries through. Colour is a layer that lays on top of the lightness experience.
This is also handy for `git` commands that insist on showing a pager for fewer than a full screen worth of lines of output.
For those wondering why anyone might not like their oh so beautiful colours...
I like to set the background colour of the terminal to light green, and the text to black. It's much more relaxing. Coloured output is often illegible with this setup. Plus the colours are silly anyway...
NO_TEXT, NO_TERMINAL, NO_FUN, NO_*, NO_NO
:)
Every language needs something like this library as part of the standard library https://pypi.org/project/appdirs/ It would at least make it a little more likely that files end up where they should.
[0]: https://specifications.freedesktop.org/basedir-spec/basedir-...
It's not really a config folder anymore, more a misused general store for files.
alias stripcolors=' sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g"'>therefore every single program must modify itself to accommodate me
Uhhh, nope?
Unless every program individually decides to implement NO_COLOR, this just adds yet another way that a program MIGHT allow you to disable color. Even if 90% of them implement it, it could just lead to issues whenever you unexpectedly run into a program in the remaining 10%.
it's like you are on a journey, and your vehicle breaks in middle, and you do not continue by feet.. because you don't know you can walk.
Normally if I'm driving somewhere it's because walking would be impractical. If my car breaks I'm going to try and fix it rather than giving up and trying to carry my stuff by hand.
Syntax highlighting vastly improves comprehension speed and accuracy. Why would you practice not having it?
I doubt the "many" parts.
It sooo much more readable if your program outputs a lot of data.
And any (proper) implementation automatically switches the escape codes of if piping to another program instead of terminal so it rarely causes problems.
I'm sure there are still some people which do not like it, and there are some libraries which mess up colors without doubt.
So I'm fully in support of NO_COLOR as a "de-facto" standard.