Answers:
watch -c SYSTEMD_COLORS=1 systemctl status icinga2
man systemd
说
$SYSTEMD_COLORS
Controls whether colorized output should be generated.
即,您可以强制使用颜色模式。
SYSTEMD_COLORS
它的作用远不如其名称所暗示的那样,因为在2018年中期引入了对可点击链接的支持,使用一些转义码和URL化URL乱丢了输出–幸运的是,可以使用SYSTEMD_URLIFY=0
systemctl
似乎没有指定何时着色输出的机制。一种快速的解决方案是使填充isatty(3)
始终返回true,从而诱使systemctl
stdout具有交互性。即您可以:
# 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 -
在所述的端部gcc
命令告诉gcc
编译C代码(-xc
从标准)( -
)。其余标志指示gcc
创建一个名为的共享库文件isatty.so
。注意,这很可能破坏其他依赖于isatty
返回合法值的程序。但是,它似乎很好,systemctl
因为isatty
似乎仅用于确定它是否应该为其输出着色。
基于@KarlC的答案,下面是一个脚本,该脚本在运行时生成并包含该库:
#!/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 $@' - LD_PRELOAD="$isatty_so" "$@"