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]"