Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The install-multi-user script uses blue, green, and red colors, as
well as bold and underline, to add helpful formatting that helps
structure its rather voluminous output.
Unfortunately, the terminal escape sequences it uses are not quite
well-formed. The relevant information is all there, just obscured
by some extra noise, a leading parameter
38
. Empirically, theresult is:
On macOS, in both Terminal.app and iTerm2, the spurious
38
isignored, the rest of the escape sequence is applied, and the colors
show up as intended.
On Linux, in at least gnome-terminal and xterm, the spurious
38
and the next parameter after it are ignored, and what's left is
applied. So in the sequence
38;4;32
, the 4 (underline) isignored but the 32 (green) takes effect; in a more typical sequence
like
38;34
, the 34 (blue) is ignored and nothing happens.These codes are all unchanged since this script's origins as a
Darwin-only script -- so the fact that they work fine in common macOS
terminals goes some way to explain how the bug arose.
Happily, we can make the colors work as intended by just deleting the
extra
38;
. Tested in all four terminals mentioned above; the newcodes work correctly on all of them, and on the two macOS terminals
they work exactly the same as before.
In a bit more technical detail -- perhaps more than anyone, me
included, ever wanted to know, but now that I've gone and learned it
I'll write it down anyway :) -- here's what's happening in these codes:
An ECMA-48 "control sequence" begins with
\033[
aka "CSI", containsany number of parameters as semicolon-separated decimal numbers (plus
sometimes other wrinkles), and ends with a byte from 0x40..0x7e. In
our case, with
m
aka "SGR", "Select Graphic Rendition".An SGR control sequence
\033[...m
sets colors, fonts, text styles,etc. In particular a parameter
31
means red,32
green,34
blue,4
underline, and0
means reset to normal. Those are all we use.There is also a
38
. This is used for setting colors too... but itneeds arguments.
38;5;nn
is color nn from a 256-color palette, and38;2;rr;gg;bb
has the given RGB values.There is no meaning defined for
38;1
or38;34
etc. On seeing aparameter
38
followed by an unrecognized argument for it, apparentlysome implementations (as seen on macOS) discard only the
38
andothers (as seen on Linux) discard the argument too before resuming.