systemctl tampaknya tidak memiliki mekanisme untuk menentukan kapan harus mewarnai keluaran. Solusi cepatnya adalah dengan shim isatty(3) untuk selalu mengembalikan true, sehingga menipu systemctl ke dalam pemikiran stdout bersifat interaktif. Yakni Anda bisa melakukan:
# 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
-xc - di akhir gcc perintah memberi tahu gcc untuk mengkompilasi kode C (-xc ) dari stdin (- ). Bendera lainnya menyatakan gcc untuk membuat file objek bersama bernama isatty.so . Perhatikan bahwa ini dapat merusak program lain yang bergantung pada isatty untuk mengembalikan nilai yang sah. Namun tampaknya baik untuk systemctl sebagai isatty tampaknya semata-mata digunakan untuk tujuan menentukan apakah outputnya harus diwarnai.
watch -c SYSTEMD_COLORS=1 systemctl status icinga2
man systemd kata
$SYSTEMD_COLORS
Controls whether colorized output should be generated.
yaitu, Anda dapat memaksakan mode warna dengan itu.
Berdasarkan jawaban @KarlC, berikut adalah skrip yang menghasilkan dan kemudian menyertakan pustaka saat runtime:
#!/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]"