Usando ls --color=always
, as cores devem ser preservadas. Não tenho certeza se
é gnu específico embora. [ Editar do OP: sim, é. ]
O caso é que ls
detecta se a saída é tty ou não.
Se não é normal, não imprima cores e não traduza
"caracteres não imprimíveis" para pontos de interrogação. Isso pode ser adicionado pelo -q
opção .
Mais sobre o assunto: Número de linhas geradas por ls .
gnu coreutils fonte ls; ref. em alguns dos dados de cores:
Editar:
Para o gnu coreutils ls: --color=always
Para ls do OS X: defina a variável de ambiente CLICOLOR_FORCE
e G
significa cor. o
core está em conformidade com ls IEEE Std 1003.1-2001 . Outras opções são
extensões que desconfiam das implementações.
OK. Eu tinha uma visão mais profunda disso. Embora do que eu li em torno de pessoas também instalar o gnu coreutils no OS X, eu acho que você talvez use o original .
As páginas de manual do OS X para ls estado:
CLICOLOR_FORCE
Color sequences are normally disabled if the output isn't directed to a
terminal. This can be overridden by setting this flag. The TERM
variable still needs to reference a color capable terminal however
otherwise it is not possible to determine which color sequences to use.
Da fonte:
Origem do Mac OS X 10.8.2 - > file_cmds-220.7 - > ls /
A partir desse código também fica claro que é possível definir
CLICOLOR_FORCE
para forçar a cor.
Como ele primeiro analisa argumentos e setenv
color em G
:
case 'G':
setenv("CLICOLOR", "", 1);
break;
E após argv
de análise:
/* CLICOLOR is set AND is a tty OR */
if (getenv("CLICOLOR") && (isatty(STDOUT_FILENO) ||
etenv("CLICOLOR_FORCE")))
/* force cli color is set */
Na próxima seção, se TERM estiver definido, a cor será usada:
if (tgetent(termcapbuf, getenv("TERM")) == 1) {
echo $TERM
deve render um terminal com capacidade de cor. Mas se você conseguir
cores por normal, este deve ser o caso.
---
Editar para a última atualização:
Não tenho certeza então. Isto é estranho. Não só a linha extra mas também que você faz
não tem total ...
no início. Você poderia começar verificando o
saída de algo como isto:
function dir() {
/bin/ls -FaGl "${@}" | awk '
function chr2hex(chr) {
return sprintf("%02x", index(i2x, chr));
}
function str2hex(str) {
r = ""
for (i = 1; i <= length(str); ++i)
r = r chr2hex(substr(str, i, 1));
return r;
}
BEGIN {
i2x = ""
for (i = 0; i < 256; ++i)
i2x = sprintf("%s%c", i2x, i);
printf("FNR : %d\n", FNR);
printf("FIELDWIDTHS: \"%s\"\n", FIELDWIDTHS);
printf("FS : \"%s\"\n", str2hex(FS));
printf("RS : \"%s\"\n", str2hex(RS));
printf("OFS : \"%s\"\n", str2hex(OFS));
printf("ORS : \"%s\"\n", str2hex(OFS));
}
{
printf("%2d:%2d:%2d \"%s\"\n", FNR, NR, NF, $0);
total += $4;
}
END {
printf("%21s: %d %s\n", "total", total / 1024, "KiB");
printf("FNR : %d\n", FNR);
printf("From : \"%s\"\n", FILENAME);
}
'
}
Deve dar-lhe algo como - ( De pode ser "-"
, por exemplo, gawk):
$ ./dir testdir
FNR : 0
FIELDWIDTHS: ""
FS : "20"
RS : "0a"
OFS : "20"
ORS : "20"
1: 1: 2 "total 24"
2: 2: 8 "drwxrwxr-x 6 mattdmo 4096 Apr 17 21:46 ./"
3: 3: 8 "drwxrwxr-x 8 mattdmo 4096 Apr 18 10:47 ../"
4: 4: 8 "drwxrwxr-x 2 mattdmo 4096 Apr 17 21:46 ab1/"
5: 5: 8 "drwxrwxr-x 2 mattdmo 4096 Apr 17 21:46 ab2/"
6: 6: 8 "drwxrwxr-x 2 mattdmo 4096 Apr 17 21:46 ab3/"
7: 7: 8 "drwxrwxr-x 2 mattdmo 4096 Apr 17 21:46 ab4/"
total: 24 KB
FNR : 7
From : ""