No hay salida de color en menos para el comando ls

21

Si ejecuto ls, obtengo resultados en color, lo que me parece bastante útil para obtener rápidamente un vistazo del tipo de archivo. Cuando trato de conectarlo lessincluso con las banderas -ry -R, el color siempre se pierde. Estoy usando la zshversión 5.0.7. ¿Algunas ideas? Gracias.

editar: estoy en OS X.

nunos
fuente
¿Puedes confirmar que lsse invoca con --color? Intente suspender la tubería ( ^Z) o usar psdesde otra terminal. ¿Qué salida which lsproduce?
zackse
Lo borré de la cola cerrada ya que el OP ha declarado claramente que lo están utilizando, less -rpor lo que no es un problema lesssino conls
terdon
Me sorprende que todavía no sea un duplicado, pero lo más cercano que pude encontrar fue la salida del comando Store en variable , y eso está en Super User.
Scott
@ Scott No estoy seguro de si hay un duplicado exacto, pero hay algunas preguntas para las cuales la respuesta es muy similar (el lsresultado depende de stdout). El que recuerdo es unix.stackexchange.com/questions/157285/… que está marcado como duplicado de unix.stackexchange.com/questions/10421/…
jimmij
@jimmij Pero esas preguntas no mencionan que eso ls --color=autosignifica usar color solo cuando se escribe en un terminal (es decir, cuando la salida estándar es un terminal), y no cuando se trata de un archivo o una tubería.
Scott

Respuestas:

21

Esto es así por diseño: los programas que producen resultados en color generalmente lo hacen solo cuando su salida va a una terminal, no cuando se envía a una tubería o a un archivo normal. La razón es que los datos enviados en un terminal son presumiblemente leídos por un humano, mientras que los datos canalizados a un programa o escritos en un archivo probablemente sean analizados por algún programa, por lo que no debe contener contenido extraño como secuencias de escape que cambian de color .

GNU lsmuestra resultados en color en un terminal cuando pasa la opción --color(o --color=auto). Para forzar la salida en color independientemente del tipo de archivo de la salida estándar, pase --color=alwayso --color=yes(son sinónimos). A esta convención le han seguido otros comandos, como GNU grep, FreeBSD grep git diff, etc.

ls --colors=yes -l | less

Con la versión de FreeBSD de ls(también se encuentra en OSX, y disponible como colorlspuerto en OpenBSD y NetBSD), pase la opción -Gde mostrar colores cuando la salida es un terminal. Configure el entorno CLICOLOR_FORCEpara mostrar colores independientemente del tipo de archivo de salida.

CLICOLOR_FORCE=1 ls -l | less
Gilles 'SO- deja de ser malvado'
fuente
20

El problema más probable es que su lsprograma haya configurado la opción, lo --color=autoque básicamente significa que la salida debe colorearse solo si está conectada a la terminal, de lo contrario (salida conectada a una tubería o un archivo) no se emiten colores.

Si desea tener colores en esos casos, debe configurar la --coloropción always, así que intente

ls --color=always | less -R

Si este comportamiento es lo que espera todo el tiempo, simplemente cree un alias:

alias ls='ls --color=always'
jimmij
fuente
En mi configuración, bash versión 4.3, --color es una opción ilegal. Grepping para "color" me informa sobre la opción "-G" pero no dice nada sobre una opción automática o siempre. ¿Algunas ideas?
nunos
55
@nunos lsno proviene bash, es un programa independiente. Ejecute ls --versionpara verificar su versión. El mío es ls GNU coreutils) 8.21 .
jimmij
@jimiij mi lsversión no tiene la --versionbandera. Estoy usando el predeterminado de OS X, no estoy seguro si eso ayuda.
nunos
@nunos, por favor, siempre menciona tu sistema operativo. Hay grandes diferencias entre Linux y no-GNU como OSX.
terdon
0

No puedo comentar la respuesta de @jimmij, porque tengo menos de 50 repeticiones, pero me gustaría explicar lo que funcionó para mí en Bash.

Si tu corres

$ man ls | grep color

verá todas las entradas de la página manpara su entorno de shell específico (en nuestro caso bash).

Para mí, el siguiente ajuste funcionó:

$ alias ls='ls -G'
titus.andronicus
fuente
3
¿Eso funcionó para qué? La -Gbandera no tiene nada que ver con cómo lsgestiona su salida de color. Eso solo elimina los grupos de la salida de ls -l. Afecta la salida de color en BSD ls (el que también se usa en OSX), ¿es eso lo que quieres decir? En cualquier caso, no creo que muestre color cuando sea redirigido a un archivo, solo mostrará color en la línea de comando.
terdon