Brak kolorowych wyników w mniej dla polecenia ls

21

Po uruchomieniu lsotrzymuję kolorowe wydruki, które uważam za całkiem przydatne, aby szybko przejrzeć rodzaj pliku. Kiedy próbuję nadać mu kolor, lessnawet przy użyciu flag -ri, -Rkolorowanie zawsze się gubi. Używam zshwersji 5.0.7. Jakieś pomysły? Dzięki.

edycja: korzystam z systemu OS X.

nunos
źródło
Czy możesz potwierdzić, lsże jest wywoływany --color? Spróbuj zawiesić potok ( ^Z) lub użyć psz innego terminala. Jaką produkcję which lsdaje?
zackse
Usunąłem to z kolejki zamkniętej, ponieważ OP wyraźnie stwierdził, że używają, less -rwięc nie jest to problem z, lessale zls
terdon
Dziwię się, że nie jest to jeszcze duplikat, ale najbliższe, jakie udało mi się znaleźć, to wyjście polecenia Store w zmiennej , i to na Super User.
Scott
@Scott Nie jestem pewien, czy istnieje dokładny duplikat, ale są pytania, na które odpowiedź jest bardzo podobna ( lswynik zależy od standardu). Ten, który pamiętam, to unix.stackexchange.com/questions/157285/…, który sam jest oznaczony jako duplikat unix.stackexchange.com/questions/10421/…
jimmij
@jimmij Ale te pytania nie wspominają, że ls --color=autooznacza to, że używaj koloru tylko podczas pisania na terminalu (tj. gdy standardowym wyjściem jest terminal), a nie gdy jest to plik lub potok.
Scott,

Odpowiedzi:

21

Wynika to z założenia: programy, które wytwarzają kolorowe wydruki, zwykle robią to tylko wtedy, gdy ich wyjście trafia do terminala, a nie gdy jest wysyłane do potoku lub zwykłego pliku. Powodem jest to, że dane wysyłane do terminala są prawdopodobnie odczytywane przez człowieka, podczas gdy dane przesyłane do programu lub zapisywane do pliku prawdopodobnie zostaną przeanalizowane przez jakiś program, więc nie powinny zawierać obcych treści, takich jak zmieniające kolor sekwencje specjalne .

GNU lswyświetla kolorowe dane wyjściowe na terminalu po przejściu opcji --color(lub --color=auto). Aby wymusić kolorowe wyjście niezależnie od typu pliku standardowego wyjścia, pass --color=alwayslub --color=yes(to synonimy). Po tej konwencji pojawiły się inne polecenia, takie jak GNU grep, FreeBSD grep git diffitp.

ls --colors=yes -l | less

W wersji FreeBSD ls(dostępnej także w OSX i dostępnej jako colorlsport w OpenBSD i NetBSD) przekaż opcję -Gwyświetlania kolorów, gdy wyjście jest terminalem. Ustaw środowisko tak, CLICOLOR_FORCEaby wyświetlało kolory niezależnie od typu pliku wyjściowego.

CLICOLOR_FORCE=1 ls -l | less
Gilles „SO- przestań być zły”
źródło
20

Problem najprawdopodobniej polega na tym, że lsprogram ma ustawioną opcję, --color=autoco w zasadzie oznacza, że ​​dane wyjściowe powinny być zabarwione tylko wtedy, gdy są podłączone do terminala, w przeciwnym razie (dane wyjściowe podłączone do potoku lub pliku) kolory nie są emitowane.

Jeśli chcesz mieć kolory w takich przypadkach, powinieneś ustawić --coloropcję na always, więc spróbuj

ls --color=always | less -R

Jeśli takie zachowanie jest oczekiwane przez cały czas, po prostu utwórz alias:

alias ls='ls --color=always'
jimmij
źródło
W moim ustawieniu bash w wersji 4.3, --color jest opcją niedozwoloną. Grepping dla „color” mówi mi o opcji „-G”, ale nie mówi nic o opcji auto lub zawsze. Jakieś pomysły?
nunos
5
@nunos lsnie pochodzi bash, to samodzielny program. Uruchom, ls --versionaby sprawdzić jego wersję. Mój jest rdzeniem GNU) 8.21 .
jimmij
@jimiij moja lswersja nie ma --versionflagi. Używam domyślnego z OS X, nie jestem pewien, czy to pomaga.
nunos
@nunos zawsze wspominaj o swoim systemie operacyjnym. Istnieją ogromne różnice między systemami Linux i non-GNU, takimi jak OSX.
terdon
0

Nie mogę skomentować odpowiedzi @jimmij, ponieważ mam mniej niż 50 powtórzeń, ale chciałbym wyjaśnić, co działało dla mnie w Bash.

Jeśli uciekniesz

$ man ls | grep color

zobaczysz wszystkie wpisy na stronie mandla twojego konkretnego środowiska powłoki (w naszym przypadku bash).

Dla mnie następująca korekta pomogła:

$ alias ls='ls -G'
titus.andronicus
źródło
3
To zadziałało po co? -GFlaga nie ma nic wspólnego z tym, jak lsudaje jej kolorową wyjście. To po prostu usuwa grupy z wyjścia ls -l. Wpływa to na kolor wyjściowy w BSD ls (ten używany również w OSX), czy o to ci chodzi? W każdym razie nie sądzę, że pokaże kolor po przekierowaniu do pliku, po prostu pokaże kolor w wierszu poleceń.
terdon