systemctl
nezdá se, že má mechanismus pro určení, kdy se má výstup obarvit. Rychlým řešením by bylo podložení isatty(3)
vždy vrátí true, čímž se oklame systemctl
do myšlení stdout je interaktivní. Jmenovitě byste mohli udělat:
# 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 -
na konci gcc
příkaz říká gcc
ke kompilaci kódu C (-xc
) z stdin (-
). Zbytek příznaků říká gcc
vytvořit sdílený objektový soubor s názvem isatty.so
. Všimněte si, že by to mohlo velmi dobře poškodit jiné programy, které spoléhají na isatty
vrátit legitimní hodnotu. Zdá se však, že je v pořádku pro systemctl
jako isatty
Zdá se, že se používá výhradně pro účely určení, zda má obarvit svůj výstup.
watch -c SYSTEMD_COLORS=1 systemctl status icinga2
man systemd
říká
$SYSTEMD_COLORS
Controls whether colorized output should be generated.
tj. můžete tím vynutit barevný režim.
Na základě odpovědi @KarlC je zde skript, který generuje a poté zahrnuje knihovnu za běhu:
#!/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]"