Czy kolorowe wyjście może być przechwycone przez przekierowanie powłoki? [duplikat]
To pytanie ma już odpowiedź tutaj:
Różne polecenia Basha, których używam -- fancy diffs, build scripts, etc, produkują dużo kolorów wyjściowych.
Kiedy przekieruję to wyjście do pliku, a następnie cat
LUB less
Plik później, koloryzacja zniknie -- prawdopodobnie B / c akt przekierowania wyjścia pozbawił kody kolorów, które każą terminalowi zmieniać kolory.
Czy istnieje sposób na przechwytywanie kolorowych danych wyjściowych, w tym koloryzacji?
7 answers
Jednym ze sposobów przechwytywania kolorowych danych wyjściowych jest polecenie script
. Uruchomienie script
spowoduje uruchomienie sesji bash, w której wszystkie surowe dane wyjściowe są przechwytywane do pliku (domyślnie o nazwie typescript
).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-18 18:19:34
Przekierowanie nie powoduje rozbierania kolorów, ale wiele poleceń wykrywa, kiedy wysyłają dane wyjściowe do terminala, a jeśli nie, domyślnie nie generuje kolorów. Na przykład, w Linuksie ls --color=auto
(który jest aliasowany do zwykłego ls
w wielu miejscach) nie będzie generował kodów kolorów, jeśli zostanie wysłany do rury lub pliku, ale ls --color
będzie. Wiele innych narzędzi ma podobne flagi nadpisywania, aby zmusić je do zapisania kolorowych danych wyjściowych do pliku, ale wszystko jest specyficzne dla danego narzędzia.
Nawet gdy masz kody kolorów w pliku, aby je zobaczyć, musisz użyć narzędzia, które pozostawia je nienaruszone. less
posiada flagę -r
do wyświetlania danych pliku w trybie "raw"; wyświetla kody kolorów. edit: nieco nowsze wersje mają również flagę-r, która jest szczególnie świadoma kodów kolorów i wyświetla je poprawnie, z lepszym wsparciem dla rzeczy takich jak owijanie/przycinanie linii niż tryb raw, ponieważ mniej może powiedzieć, które rzeczy są kodami kontrolnymi, a które faktycznie są znakami przechodzącymi na ekran.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-11 17:36:16
Niektóre programy usuwają koloryzację, gdy zdają sobie sprawę, że wyjście nie jest TTY (tj. gdy przekierowujesz je do innego programu). Możesz powiedzieć niektórym z nich, aby używali kolorów na siłę, i powiedzieć pagerowi, aby włączył koloryzację, na przykład użyj less -R
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-18 18:30:41
Odkryłem, że używanie script
do zachowania kolorów podczas rurociągu do less
naprawdę nie działa (less jest cały popaprany, a przy wyjściu bash jest cały popaprany), ponieważ less jest interaktywny. script
wydaje się, że naprawdę psuje wejście pochodzące z stdin
nawet po wyjściu.
Więc zamiast biegać:
script -q /dev/null cargo build | less -R
Przekierowuję /dev/null
do niego przed orurowaniem do less:
script -q /dev/null cargo build < /dev/null | less -R
Więc teraz script
nie zadziera z stdin
i dostaje dokładnie to, czego chcę. Jest odpowiednikiem command | less
, ale zachowuje kolory, jednocześnie kontynuując czytanie nowej zawartości dołączonej do pliku(inne metody, które próbowałem, nie zrobiłyby tego).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-13 19:05:38
Zainspirowany innymi odpowiedziami, zacząłem używać script
. Musiałem użyć -c
, aby go uruchomić. Wszystkie inne odpowiedzi, w tym tee
, różne przykłady script
nie działały dla mnie.
Kontekst:
- Ubuntu 16.04
- Uruchamianie testów zachowania z
behave
i uruchamianie komend powłoki podczas testu zsubprocess.check_call()
Rozwiązanie:
script --flush --quiet --return /tmp/ansible-output.txt --command "my-ansible-command"
Wyjaśnienie dla przełączników:
-
--flush
było potrzebne, ponieważ w przeciwnym razie wyjście nie jest dobrze widoczne na żywo, przychodzi w dużych kawałkach -
--quiet
wyłącza własne wyjście narzędzia skryptowego -
-c, --command
bezpośrednio dostarcza polecenie do wykonania, przekierowanie z mojego polecenia do skryptu nie działało dla mnie (brak kolorów) -
--return
aby skrypt propagował kod wyjścia mojego polecenia, abym wiedział, czy moje polecenie nie powiodło się
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-06 15:22:12
To pytanie na superuser pomogło mi, gdy moja inna odpowiedź (z udziałem tee
) nie zadziałała. Polega ona na użyciu unbuffer
, aby Komenda myślała, że działa z powłoki.
Zainstalowałem go używając sudo apt install expect tcl
zamiast sudo apt-get install expect-dev
.
Musiałem użyć tej metody podczas przekierowywania wyjścia apt
, Jak na ironię.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:43
Używam tee
: przekieruj wyjście polecenia do tee
filename
i utrzyma kolor. A jeśli nie chcesz widzieć wyjścia na ekranie (do czego służy tee
: wyświetlanie i przekierowywanie wyjścia w tym samym czasie), po prostu wyślij wyjście tee
do /dev/null
:
command
| tee
filename
> /dev/null
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-28 09:05:55