systemctl
ne semble pas avoir de mécanisme pour spécifier quand colorer la sortie. Une solution rapide serait de caler isatty(3)
pour toujours retourner vrai, trompant ainsi systemctl
en pensant que stdout est interactif. A savoir vous pourriez faire :
# 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
Le -xc -
à la fin du gcc
la commande indique gcc
pour compiler du code C (-xc
) de stdin (-
). Le reste des drapeaux indique gcc
pour créer un fichier objet partagé nommé isatty.so
. Notez que cela pourrait très bien casser d'autres programmes qui reposent sur isatty
pour renvoyer une valeur légitime. Cela semble cependant convenir pour systemctl
comme isatty
semble être utilisé uniquement dans le but de déterminer s'il doit colorer sa sortie.
watch -c SYSTEMD_COLORS=1 systemctl status icinga2
man systemd
dit
$SYSTEMD_COLORS
Controls whether colorized output should be generated.
c'est-à-dire que vous pouvez forcer le mode couleur avec cela.
Basé sur la réponse de @KarlC, voici un script qui génère puis inclut la bibliothèque lors de l'exécution :
#!/bin/bash
set -euo pipefail
function clean_up {
trap - EXIT # Restore default handler to avoid recursion
[[ -e "${isatty_so:-}" ]] && 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
"${SH:-$SHELL}" -c 'eval [email protected]' - LD_PRELOAD="$isatty_so" "[email protected]"