ls(1): actually restore proper behavior

Highlights:
- CLICOLOR in the environment should imply --color=auto to maintain
  compatibility with historical behavior
- -G should set CLICOLOR and imply --color=auto

The manpage has been updated to draw the connection between -G and --color;
the former is in-fact a sort of compromise between --color=always and
--color=auto, where we'll output color regardless of the environment lacking
CLICOLOR/COLORTERM assuming stdout is a tty.

X-MFC-With: r361318
This commit is contained in:
Kyle Evans 2020-05-21 14:39:00 +00:00
parent e165a15b5f
commit a408dc2018
2 changed files with 16 additions and 2 deletions

View File

@ -32,7 +32,7 @@
.\" @(#)ls.1 8.7 (Berkeley) 7/29/94
.\" $FreeBSD$
.\"
.Dd May 20, 2020
.Dd May 21, 2020
.Dt LS 1
.Os
.Sh NAME
@ -135,7 +135,8 @@ This option is equivalent to defining
.Ev CLICOLOR
or
.Ev COLORTERM
in the environment.
in the environment and setting
.Fl -color Ns = Ns Ar auto .
(See below.)
This functionality can be compiled out by removing the definition of
.Ev COLORLS .

View File

@ -265,6 +265,13 @@ main(int argc, char *argv[])
fts_options = FTS_PHYSICAL;
if (getenv("LS_SAMESORT"))
f_samesort = 1;
/*
* For historical compatibility, we'll use our autodetection if CLICOLOR
* is set.
*/
if (getenv("CLICOLOR"))
colorflag = COLORFLAG_AUTO;
while ((ch = getopt_long(argc, argv,
"+1ABCD:FGHILPRSTUWXZabcdfghiklmnopqrstuwxy,", long_opts,
NULL)) != -1) {
@ -342,7 +349,13 @@ main(int argc, char *argv[])
f_slash = 0;
break;
case 'G':
/*
* We both set CLICOLOR here and set colorflag to
* COLORFLAG_AUTO, because -G should not force color if
* stdout isn't a tty.
*/
setenv("CLICOLOR", "", 1);
colorflag = COLORFLAG_AUTO;
break;
case 'H':
fts_options |= FTS_COMFOLLOW;