Pas de sortie colorée en moins pour la commande ls

21

Si je lance, lsj'obtiens une sortie colorée que je trouve assez pratique pour obtenir rapidement un aperçu du type de fichier. Lorsque j'essaie de le canaliser lessavec les drapeaux -ret, -Rla coloration se perd toujours. J'utilise la zshversion 5.0.7. Des idées? Merci.

edit: je suis sur OS X.

nunos
la source
Pouvez-vous confirmer qu'il lsest invoqué avec --color? Essayez de suspendre le pipeline ( ^Z) ou d'utiliser à pspartir d'un autre terminal. Quelle sortie which lsproduit?
zackse
J'ai effacé cela de la file d'attente fermée, car le PO a clairement déclaré qu'ils utilisent less -rdonc ce n'est pas un problème avec lessmais avecls
terdon
Je suis surpris que ce ne soit pas encore un doublon, mais le plus proche que j'ai pu trouver était la sortie de la commande Store en variable , et c'est sur Super User.
Scott
@Scott Je ne sais pas s'il y a un double exact, mais il y a des questions pour lesquelles la réponse est très similaire (le lsrésultat dépend de stdout). Celui dont je me souviens est unix.stackexchange.com/questions/157285/… qui lui-même est marqué comme double de unix.stackexchange.com/questions/10421/…
jimmij
@jimmij Mais ces questions ne mentionnent pas que cela ls --color=autosignifie utiliser la couleur uniquement lors de l'écriture sur un terminal (c'est-à-dire lorsque la sortie standard est un terminal), et non lorsqu'il s'agit d'un fichier ou d'un canal.
Scott

Réponses:

21

Ceci est voulu par la conception même du produit: les programmes qui produisent une sortie colorée ne le font généralement que lorsque leur sortie est envoyée vers un terminal, et non lorsqu'elle est envoyée vers un canal ou vers un fichier normal. La raison en est que les données envoyées sur un terminal sont vraisemblablement lues par un humain, tandis que les données transmises à un programme ou écrites dans un fichier sont susceptibles d'être analysées par un programme, de sorte qu'elles ne devraient pas contenir de contenu étranger comme des séquences d'échappement à changement de couleur. .

GNU lsaffiche une sortie colorée sur un terminal lorsque vous passez l'option --color(ou --color=auto). Pour forcer la sortie colorée quel que soit le type de fichier de la sortie standard, passez --color=alwaysou --color=yes(ce sont des synonymes). Cette convention a été suivie par d'autres commandes, comme GNU grep, FreeBSD grep git diff, etc.

ls --colors=yes -l | less

Avec la version FreeBSD de ls(également disponible sur OSX, et disponible comme colorlsport sur OpenBSD et NetBSD), passez l'option -Gpour afficher les couleurs lorsque la sortie est un terminal. Définissez l'environnement CLICOLOR_FORCEpour afficher les couleurs quel que soit le type de fichier de sortie.

CLICOLOR_FORCE=1 ls -l | less
Gilles 'SO- arrête d'être méchant'
la source
20

Le problème est probablement que votre lsprogramme a défini une option, --color=autoce qui signifie que la sortie ne doit être colorée que si elle est connectée au terminal, sinon (sortie connectée à un tuyau ou à un fichier) aucune couleur n'est émise.

Si vous souhaitez avoir des couleurs dans de tels cas, vous devez définir l' --coloroption sur always, essayez donc

ls --color=always | less -R

Si ce comportement est ce que vous attendez tout le temps, créez simplement un alias:

alias ls='ls --color=always'
jimmij
la source
Dans ma configuration, bash version 4.3, --color est une option illégale. Grepping pour "color" me parle de l'option "-G" mais ne dit rien sur une option auto ou always. Des idées?
nunos
5
@nunos lsne vient pas bash, c'est un programme autonome. Exécutez ls --versionpour vérifier sa version. Le mien est ls GNU coreutils) 8.21 .
jimmij
@jimiij ma lsversion n'a pas le --versiondrapeau. J'utilise celui par défaut d'OS X, je ne sais pas si cela aide.
nunos
@nunos veuillez toujours mentionner votre système d'exploitation. Il existe d'énormes différences entre Linux et les non-GNU comme OSX.
terdon
0

Je ne peux pas commenter la réponse de @jimmij, car j'ai moins de 50 représentants, mais je voudrais expliquer ce qui a fonctionné pour moi à Bash.

Si vous courez

$ man ls | grep color

vous verrez toutes les entrées de la page manpour votre environnement shell spécifique (dans notre cas bash).

Pour moi, l'ajustement suivant a fait l'affaire:

$ alias ls='ls -G'
titus.andronicus
la source
3
Cela a fonctionné pour quoi? Le -Gdrapeau n'a rien à voir avec la façon dont lsgère sa sortie colorée. Cela supprime simplement les groupes de la sortie de ls -l. Cela affecte la sortie couleur dans BSD ls (celle utilisée également sur OSX), c'est ce que vous voulez dire? Dans tous les cas, je ne pense pas que cela affichera la couleur lorsqu'il sera redirigé vers un fichier, il affichera simplement la couleur sur la ligne de commande.
terdon