Wie bekomme ich, dass systemctl in Farbe druckt, wenn ich mit einem Nicht-TT-Benutzer interagiere?

4519
KarlC

Wenn ich einen Befehl wie folgt ausführe:

# systemctl status plexmediaserver 

Ich bekomme eine schöne farbige Ausgabe. Aber wenn ich den folgenden Befehl ausführen:

# watch -n300 --color systemctl status plexmediaserver 

Gibt es eine Möglichkeit, diesen watchBefehl mit Farbe auszuführen systemctl? Ich habe mir die Manpage angesehen systemctl, sehe aber nirgendwo einen Bezug zu Farbe.

14
Bitte beachten Sie, dass Sie die Antwort von towolf (https://superuser.com/a/1196178/664) akzeptieren, die viel besser ist als die derzeit akzeptierte (Ihre). Danke im Voraus. Piotr Dobrogost vor 6 Jahren 0

3 Antworten auf die Frage

23
KarlC

systemctlscheint keinen Mechanismus zu haben, der angibt, wann die Ausgabe eingefärbt werden soll. Eine schnelle Lösung wäre, Shim isatty(3)immer zurück zu kehren, um systemctlzu denken, dass stdout interaktiv ist. Sie könnten nämlich folgendes tun:

# echo "int isatty(int fd) { return 1; }" | gcc -O2 -fpic -shared -ldl -o isatty.so -xc - # LD_PRELOAD=./isatty.so watch -n300 --color systemctl status plexmediaserver 

Am -xc -Ende des gccBefehls wird gccC code ( -xc) aus stdin ( -) kompiliert . Die restlichen Flags geben gccan, eine gemeinsam genutzte Objektdatei mit dem Namen zu erstellen isatty.so. Beachten Sie, dass dies sehr wahrscheinlich andere Programme zerstören kann, auf isattydie ein legitimer Wert zurückgegeben wird. Es scheint jedoch in Ordnung zu sein, systemctlda es isattyscheint, als würde es ausschließlich dazu verwendet, um zu bestimmen, ob es seine Ausgabe farbig machen soll.

Das ist brilliant. Ich habe ein [Skript zur Automatisierung des Prozesses] erstellt (https://superuser.com/a/1245671/365890). Tom Hale vor 7 Jahren 0
Nachdem ich die Antwort von Towolf gelesen und gewählt hatte (was viel besser ist als diese), wollte ich dies abstimmen, aber dies ist ein zu perfekter Hack, also stimme ich stattdessen mit irgendwie gemischten Gefühlen ab :) Piotr Dobrogost vor 6 Jahren 0
10
towolf
watch -c SYSTEMD_COLORS=1 systemctl status icinga2 

man systemd sagt

 $SYSTEMD_COLORS Controls whether colorized output should be generated. 

dh Sie können damit den Farbmodus erzwingen.

0
Tom Hale

Based on @KarlC's answer, here is a script which generates and then includes the library at runtime:

#!/bin/bash set -euo pipefail function clean_up { trap - EXIT # Restore default handler to avoid recursion [[ -e "$" ]] && rm "$isatty_so" } # shellcheck disable=2154 ## err is referenced but not assigned trap 'err=$?; clean_up; exit $err' EXIT HUP INT TERM isatty_so=$(mktemp --tmpdir "$(basename "$0")".XXXXX.isatty.so) echo "int isatty(int fd) { return 1; }" \ | gcc -O2 -fpic -shared -ldl -o "$isatty_so" -xc - # Allow user to SH=/bin/zsh faketty mycommand "$" -c 'eval $@' - LD_PRELOAD="$isatty_so" "$@"