Нет цветного вывода меньше для команды ls

21

Если я запускаю, lsя получаю цветной вывод, который я нахожу довольно удобным для быстрого получения вида файла. Когда я пытаюсь трубы этом lessдаже с -rи -Rфлагами красящей всегда выпадали. Я использую zshверсию 5.0.7. Любые идеи? Спасибо.

редактировать: я на OS X.

nunos
источник
Можете ли вы подтвердить ls, что вызывается с --color? Попробуйте приостановить конвейер ( ^Z) или использовать psдругой терминал. Какой выход which lsпроизводит?
Заксе
Я очистил это от очереди закрытия, так как OP четко заявил, что они используют, less -rтак что это не проблема, lessно сls
terdon
Я удивлен, что это еще не дубликат, но ближе всего я смог найти вывод команды Store в переменную , и это на Super User.
Скотт
@ Скотт Я не уверен, есть ли точная копия, но есть некоторые вопросы, ответ на которые очень похож ( lsрезультат зависит от стандартного вывода). Я помню один unix.stackexchange.com/questions/157285/…, который помечен как дубликат unix.stackexchange.com/questions/10421/…
jimmij
@jimmij Но эти вопросы не упоминают, что ls --color=autoозначает использовать цвет только при записи в терминал (т. е. когда стандартный вывод является терминалом), а не когда это файл или канал.
Скотт

Ответы:

21

Это сделано специально: программы, которые выдают цветной вывод, обычно делают это только тогда, когда их вывод поступает на терминал, а не когда они отправляются в канал или в обычный файл. Причина в том, что данные, отправленные на терминал, предположительно считываются человеком, тогда как данные, переданные в программу или записанные в файл, вероятно, будут проанализированы какой-либо программой, поэтому они не должны содержать постороннего содержимого, такого как изменяющие цвет escape-последовательности ,

GNU lsотображает цветной вывод на терминале, когда вы передаете опцию --color(или --color=auto). Чтобы вызвать цветной вывод независимо от типа файла стандартного вывода, передайте --color=alwaysили --color=yes(это синонимы). За этим соглашением следовали другие команды, такие как GNU grep, FreeBSD grep git diffи т. Д.

ls --colors=yes -l | less

В версии FreeBSD ls(также найденной в OSX и доступной как colorlsпорт в OpenBSD и NetBSD), пропустите опцию -Gдля отображения цветов, когда вывод является терминалом. Установите среду CLICOLOR_FORCEдля отображения цветов независимо от типа выходного файла.

CLICOLOR_FORCE=1 ls -l | less
Жиль "ТАК - перестань быть злым"
источник
20

Проблема, скорее всего, состоит в том, что ваша lsпрограмма имеет установленную опцию, --color=autoкоторая в основном означает, что вывод должен быть окрашен только в том случае, если он подключен к терминалу, в противном случае (вывод, подключенный к каналу или файлу) никакие цвета не излучаются.

Если вы хотите, чтобы цвета были в таких случаях, вы должны установить --colorопцию always, поэтому попробуйте

ls --color=always | less -R

Если вы ожидаете такого поведения все время, просто создайте псевдоним:

alias ls='ls --color=always'
jimmij
источник
В моей установке, bash версии 4.3, --color является недопустимым параметром. Обращение к «color» говорит мне о параметре «-G», но ничего не говорит о параметре auto или всегда. Любые идеи?
nunos
5
@nunos lsне приходит bash, это отдельная программа. Запустите, ls --versionчтобы проверить его версию. Мой - ls GNU coreutils) 8.21 .
Джимми
@jimiij у моей lsверсии нет --versionфлага. Я использую по умолчанию один из OS X, не уверен, поможет ли это.
nunos
@nunos, пожалуйста, всегда упоминайте свою операционную систему. Существуют огромные различия между Linux и не-GNU никсами, такими как OSX.
Terdon
0

Я не могу комментировать ответ @jimmij, потому что у меня менее 50 представителей, но я хотел бы объяснить, что сработало для меня в Bash.

Если вы бежите

$ man ls | grep color

вы увидите все записи man-page для вашей конкретной среды оболочки (в нашем случае bash).

Для меня следующие настройки сделали свое дело:

$ alias ls='ls -G'
titus.andronicus
источник
3
Это сработало для чего? -GФлаг не имеет ничего общего с тем, как lsуправляет цветной вывод. Это просто удаляет группы из вывода ls -l. Это влияет на вывод цвета в BSD ls (который также используется в OSX), это то, что вы имеете в виду? В любом случае, я не думаю, что при перенаправлении в файл будет отображаться цвет, он будет отображаться в командной строке.
Terdon