当与非 tty 交互时,如何让 systemctl 以彩色打印?

当与非 tty 交互时,如何让 systemctl 以彩色打印?

当我运行这样的命令时:

# systemctl status plexmediaserver

我得到了色彩鲜艳的输出。但是当我运行以下命令时:

# watch -n300 --color systemctl status plexmediaserver

有什么方法可以让我watch使用 color from 来执行这个命令吗systemctl?我查看了手册页,systemctl但没有看到任何地方提到 color。

答案1

watch -c  SYSTEMD_COLORS=1 systemctl status icinga2

man systemd

   $SYSTEMD_COLORS
       Controls whether colorized output should be generated.

即,您可以使用它来强制使用彩色模式。

答案2

systemctl似乎没有指定何时为输出着色的机制。一个快速的解决方案是让 shimisatty(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 -末尾的指示从 stdin ( )编译 C 代码 ( ) 。其余标志指示创建一个名为 的共享对象文件。请注意,这很可能会破坏依赖于返回合法值的其他程序。但是,这似乎没问题,因为似乎仅用于确定是否应为其输出着色。gccgcc-xc-gccisatty.soisattysystemctlisatty

答案3

基于@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" "$@"

相关内容